2010-12-14 4 views
1

엔티티 간의 ManyToMany 관계에 문제가 있습니다. 추가 작업은 잘되지만 Commune을 제거 할 수는 없습니다.관계가있는 문제 ManyToMany 엔터티간에

javax.faces.el.EvaluationException: javax.ejb.EJBException: Transaction aborted 
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) 
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
at java.lang.Thread.run(Thread.java:636) 
Caused by: javax.ejb.EJBException: Transaction aborted 
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5046) 
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4805) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84) 
at $Proxy218.supprimer(Unknown Source) 
at SessionTest.__EJB31_Generated__TestSession__Intf____Bean__.supprimer(Unknown Source) 
at test.supprimer(test.java:66) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:616) 
at com.sun.el.parser.AstValue.invoke(AstValue.java:234) 
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98) 
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
... 32 more 
Caused by: javax.transaction.RollbackException: Transaction marked for rollback. 
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:450) 
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:837) 
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5040) 
... 48 more 
Caused by: Exception [EclipseLink-45] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DescriptorException 
Exception Description: Missing mapping for field [Commune.id]. 
Descriptor: RelationalDescriptor(entites.Commune --> [DatabaseTable(Commune)]) 
at org.eclipse.persistence.exceptions.DescriptorException.missingMappingForField(DescriptorException.java:951) 
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.extractValueFromObjectForField(ObjectBuilder.java:1970) 
at org.eclipse.persistence.mappings.ManyToManyMapping.prepareTranslationRow(ManyToManyMapping.java:931) 
at org.eclipse.persistence.mappings.ManyToManyMapping.earlyPreDelete(ManyToManyMapping.java:135) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1374) 
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:547) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1508) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3128) 
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:268) 
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157) 
at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68) 
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412) 
... 50 more 
+0

언제 예외가 발생합니까? "note rmeove Commune"이 무슨 뜻이야? – Nick

+0

GRAVE : javax.ejb.EJBException : 트랜잭션이 중단되고 Comune을 삭제할 수 없습니다. – Kohan95

답변

2

당신은 그것을 인해 외래 키에 하나 개 이상의 Tuteur 기록에 연결된 코뮌을 삭제할 수 없습니다 :이 오류 메시지가

public class Tuteur implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String nom; 

    @ManyToMany(mappedBy="tuteurs",fetch=FetchType.EAGER) 
    private List<Commune> communes; 
    ... 
} 


public class Commune implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 
private String nomCommune; 


@ManyToMany(fetch=FetchType.EAGER) 
@JoinTable(name="Tuteur_Commune",[email protected](name="Commune_Fk", 
      referencedColumnName="id") 
        ,[email protected](name="Tuteur_Fk",referencedColumnName="id")) 
private List<Tuteur> tuteurs; 
...} 

: 여기

내 entites 있습니다 제약 조건. 종속 레코드를 삭제하려면 계단식 옵션 중 하나를 사용해야하며 그렇지 않은 경우에는 관계가 깨지는 논리를 작성해야합니다.

귀하의 경우에는 정확한 해결책은 먼저 Commune 인스턴스와 참조 된 모든 Tuteur 인스턴스 간의 관계를 지운 다음 Commune 인스턴스를 삭제하는 것입니다. 아래 그림과 같이

당신은 프로그램이 작업을 수행 할 수 있습니다 :

for (Tuteur tuteur in commune.tuteurs) { 
    tuteur.getCommunes().remove(commune); 
    entityManager.persist(tuteur); 
} 

commune.getTuteurs().clear(); 
entityManager.persist(commune); 
entityManager.remove(commune); 

또는 JPQL 업데이트 문의 부부와 함께

.

편집 :

Caused by: Exception [EclipseLink-45] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DescriptorException 
Exception Description: Missing mapping for field [Commune.id]. 
Descriptor: RelationalDescriptor(entites.Commune --> [DatabaseTable(Commune)]) 

자, 내 경험은 EclipseLink 때로는 오해 나 혼란 예외를 던져 : 나는 다음과 같은 근본 원인을 포함하여 스택 추적을 다시 읽어보십시오.

@JoinTable 선언을 살펴본 결과 외래 키가 양방향으로 목표 테이블의 @Id 열이므로 특정 경우에 referenceColumnName 옵션을 생략 할 수 있습니다. 그게 문제의 원인이라고 생각하지 않지만 어쨌든 시도해 볼 수는 있습니다.

또 다른 옵션은 JPA와 EclipseLink가 조인 테이블을 정의하도록하는 것입니다. 당신은 @JoinTable 선언을 완전히 생략함으로써 그렇게합니다. 수동으로 조인 테이블을 선언해야하는 특별한 이유가 없다면 어쨌든이 방법을 사용하십시오. 보일러 플레이트 코드 및 구성 요구 사항을 줄이기 위해 EJB 3.0의 많은 개선 사항이 제어에 대한 관례와 관련되어 있음을 기억하십시오.

+0

무엇을 말할 수 있습니까? 감사합니다. 매우 감사합니다. @JoinTable을 제거하면 매우 효과적입니다. 감사합니다. 다시 – Kohan95