Hi,

I have set up a very simple entity model to test relationships in EJB3. I have 
no problems in adding to them, and removing an entity so long as it is not used 
in a relationship (not refered to as a foriegn key value).

The problem occurs when trying to remove the entity when it is used in a 
relationship be it many to many or many to one/one to many.  Another thing to 
note about the relationships between the entites is that on the owning side a 
java.util.Set is used and on the non-owning side a java.util.Collection is 
used. To give an example of a this in a many to many context.

I have 3 Entities Student, Course, and Institution and all of these 
relationships are many to many (please see below).
In Student.java the student-course many to many and collection declaration

  | private Collection<Course> mCourses = new ArrayList<Course>();
  | 
  | @ManyToMany(mappedBy = "students", fetch = FetchType.EAGER, cascade 
={CascadeType.PERSIST, CascadeType.MERGE})   
  |     public Collection<Course> getCourses() {
  |         return mCourses;
  |     }
  | 

in Course.java student-course many to many and collection declarations/b]

  | private Set<Student> mEnrolledStudents = new HashSet<Student>();
  | 
  | @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = 
FetchType.EAGER)
  |     @JoinTable(name = "course_student",
  |                 joinColumns = @JoinColumn(name = "course_id", 
referencedColumnName = "course_id"),
  |                 inverseJoinColumns = @JoinColumn(name = "student_id", 
referencedColumnName = "student_id"))   
  |     public Set<Student> getStudents() {       
  |         return mEnrolledStudents;
  |     }


in Course.java course-institution many to many and collection declaration

  | private Collection<Institution> mInstitutionsRunningCourse = new 
ArrayList<Institution>();
  | 
  | @ManyToMany(mappedBy = "courses", cascade = {CascadeType.PERSIST, 
CascadeType.MERGE})
  |     public Collection<Institution> getInstitutions() {
  |         return mInstitutionsRunningCourse;
  |     }


in Institution.java course-institution many to many

  | private Set<Course> mCoursesOffered = new HashSet<Course>();
  | 
  | @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = 
FetchType.EAGER)   
  |     @JoinTable(name = "institution_course",
  |                 joinColumns = @JoinColumn(name = "institution", 
referencedColumnName = "institution_id") ,
  |                 inverseJoinColumns = @JoinColumn(name = "course", 
referencedColumnName = "course_id") )
  |     public Set<Course> getCourses() {       
  |         return mCoursesOffered;
  |     }


I create a course with 3 students on it (3 entries in the association table) 
and also link this course to 2 institutions (2 entries in the association 
table). Then i try to call the EntityManager.remove() method from within the 
same SLSB. The error i get is this

anonymous wrote : Caused by: java.lang.RuntimeException: 
org.jboss.tm.JBossRollbackException: Unable to commit, 
tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=dale.comsoft.de/50, 
BranchQual=, localId=50] status=STATUS_NO_TRANSACTION; - nested throwable: 
(javax.persistence.EntityNotFoundException: 
org.hibernate.ObjectDeletedException: deleted entity passed to persist: 
[test.Course#])
  | at 
org.jboss.aspects.tx.TxPolicy.handleEndTransactionException(TxPolicy.java:198)
  | at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:180)
  | at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
  | at 
org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
  | at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | at 
org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
  | at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | at 
org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
  | at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | at 
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
  | at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | at 
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
  | at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | at 
org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
  | at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  | at 
org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:181)
  | at 
org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
  | at $Proxy347.tryDelete(Unknown Source)
  | at test.TestRelationships.storeData(TestRelationships.java:63)
  | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  | at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  | at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  | at java.lang.reflect.Method.invoke(Method.java:585)
  | at 
org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
  | ... 29 more
  | Caused by: org.jboss.tm.JBossRollbackException: Unable to commit, 
tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=dale.comsoft.de/50, 
BranchQual=, localId=50] status=STATUS_NO_TRANSACTION; - nested throwable: 
(javax.persistence.EntityNotFoundException: 
org.hibernate.ObjectDeletedException: deleted entity passed to persist: 
[test.Course#])
  | at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:372)
  | at org.jboss.tm.TxManager.commit(TxManager.java:240)
  | at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
  | ... 51 more
  | Caused by: javax.persistence.EntityNotFoundException: 
org.hibernate.ObjectDeletedException: deleted entity passed to persist: 
[test.Course#]
  | at 
org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:564)
  | at 
org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:484)
  | at 
org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1491)
  | at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1110)
  | at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
  | ... 53 more
  | Caused by: org.hibernate.ObjectDeletedException: deleted entity passed to 
persist: [test.Course#]
  | at 
org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:90)
  | at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:646)
  | at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:638)
  | at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:225)
  | at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213)
  | at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157)
  | at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
  | at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:290)
  | at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)
  | at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)
  | at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
  | at org.hibernate.engine.Cascade.cascade(Cascade.java:248)
  | at 
org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:130)
  | at 
org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:121)
  | at 
org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
  | at 
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
  | at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993)
  | at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:340)
  | at 
org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:475)
  | ... 56 more


I cannot figure out what is wrong, I even tried to clear the set and collection 
first thus leaving the database in the correct state (tested it by just calling 
persist and not remove) then removing the entity and i still get the same 
error. 

I have also tried annotating with this :

  | @org.hibernate.annotations.Cascade( {
  |          org.hibernate.annotations.CascadeType.ALL,
  |          org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
  | 

but that does not work.

Can anyone shed any light on where i have gone wrong ?

Thanks in advance,

Andy

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3972305#3972305

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3972305
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to