2010-12-14 126 views
1

我有一个实体之间的ManyToMany关系的问题。添加作品非常好,但我无法删除公社。问题与实体之间ManyToMany

这里是我的entites:

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; 
...} 

我有这样的错误消息:

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 2010-12-14 23:11:36

+0

GRAVE:javax.ejb.EJBException:事务异常终止,我无法删除Comune和 – Kohan95 2010-12-14 23:36:47

回答

2

不能删除当它连接到一个或多个Tuteur记录由于外键公社限制。您必须使用其中一个Cascade选项删除依赖记录(虽然对于多对多关系来说,这与您的情况不同),或者您必须编写用于打破关系的逻辑。

所以我猜你的情况下,正确的解决方案是首先清除公社实例和所有引用的Tuteur实例之间的关系,然后删除公社实例。

您可以通过编程方式做到这一点如下图所示:

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声明,我注意到在您的特定情况下,referenceColumnName选项可以省略,因为您的外键是目标表的@Id列在两个方向上。我不认为这是问题的原因,但您可能想尝试。

另一个尝试的方法是简单地让JPA和EclipseLink定义连接表。你通过完全忽略@JoinTable声明来做到这一点。除非你有手动声明连接表的具体原因,否则这是顺便说一句。请记住,EJB 3.0中的许多改进与常规控制相关,以减少锅炉板代码和配置要求。

+0

我能说什么只是 非常感谢你, 我所做的只是删除@JoinTable,它工作得很好,谢谢再次 – Kohan95 2010-12-15 20:22:30