Hello all.

I got a problem with updating the relation table between two entities.

This problem only occurs when i'm using a "Listener" class to set a field from 
a MappedSuperclass. For a better understanding i have made a screenshot of my 
situation.

http://img221.imageshack.us/img221/7346/mtonrelationproblemjw1.jpg

As you can see i have a GeneralEntity as MappedSuperclass with one attribute 
and two entities which inherit this field from the GeneralEntity. Additional 
the Parent and Child have one idFeld which is tagged as Identifier and one 
dataField from type String. Between Parent and child we have a M:N relation.

When i send an update to the database with a parent object including a child 
object, the persist method is called and data is saved correctly in the 
database. 

When i send an update again (with or without changes) and using the same 
identifiers, then is no update on parent table, no update on child table, which 
is correct when nothing is changed, BUT we have an delete on the relation 
table!!

I check the server log and found the following part, where the delete statement 
is triggered:


  | 2007-12-13 16:47:23,515 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] processing flush-time 
cascades
  | 2007-12-13 16:47:23,515 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] dirty checking 
collections
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.engine.CollectionEntry] 
Collection dirty: [com.trinitec.samples.ejb3xfire.Parent.child#PARENT01]
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.engine.Collections] Collection 
found: [com.trinitec.samples.ejb3xfire.Parent.child#PARENT01], was: 
[com.trinitec.samples.ejb3xfire.Parent.child#PARENT01] (initialized)
  | 2007-12-13 16:47:23,515 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 insertions, 
2 updates, 0 deletions to 3 objects
  | 2007-12-13 16:47:23,515 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 
(re)creations, 1 updates, 0 removals to 1 collections
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.pretty.Printer] listing 
entities:
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.pretty.Printer] 
com.trinitec.samples.ejb3xfire.Child{dataFeld2=Child_01, idFeld2=CHILD01, 
systemId=3}
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.pretty.Printer] 
com.trinitec.samples.ejb3xfire.Parent{child=[com.trinitec.samples.ejb3xfire.Child#CHILD01],
 dataFeld1=Parent_01, systemId=3, idFeld1=PARENT01}
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.pretty.Printer] 
com.trinitec.samples.ejb3xfire.Transaction{status=OK, startTime=1197560843453, 
pk=component[transactionId,principalId]{transactionId=2, principalId=rb}, 
endTime=0}
  | 2007-12-13 16:47:23,515 DEBUG 
[org.hibernate.persister.collection.AbstractCollectionPersister] Deleting rows 
of collection: [com.trinitec.samples.ejb3xfire.Parent.child#PARENT01]
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to 
open PreparedStatement (open PreparedStatements: 0, globally: 0)
  | 2007-12-13 16:47:23,515 DEBUG [org.hibernate.jdbc.ConnectionManager] 
opening JDBC connection
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.SQL] delete from PARENTS2CHILD 
where PARENTS_ID_FELD1_FK=? and CHILD_ID_FELD2_FK=?
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.persister.collection.AbstractCollectionPersister] done deleting 
collection rows: 1 deleted
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.persister.collection.AbstractCollectionPersister] Inserting rows 
of collection: [com.trinitec.samples.ejb3xfire.Parent.child#PARENT01]
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.persister.collection.AbstractCollectionPersister] done inserting 
rows: 0 inserted
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.jdbc.AbstractBatcher] 
Executing batch size: 1
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to 
close PreparedStatement (open PreparedStatements: 1, globally: 1)
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.jdbc.ConnectionManager] 
skipping aggressive-release due to flush cycle
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.jdbc.ConnectionManager] 
aggressively releasing JDBC connection
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.jdbc.ConnectionManager] 
releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open 
ResultSets: 0, globally: 0)]
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] processing flush-time 
cascades
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] dirty checking 
collections
  | 2007-12-13 16:47:23,546 DEBUG [org.hibernate.engine.Collections] Collection 
found: [com.trinitec.samples.ejb3xfire.Parent.child#PARENT01], was: 
[com.trinitec.samples.ejb3xfire.Parent.child#PARENT01] (initialized)
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 insertions, 
1 updates, 0 deletions to 3 objects
  | 2007-12-13 16:47:23,546 DEBUG 
[org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 
(re)creations, 0 updates, 0 removals to 1 collections
  | 

For a second test i add the annotation @persistence.column.update to the 
systemId attribute in the MappedSuperclass. So the system should ignore this 
field when updating.

When i call the update method the first time. All data is inserted correctly to 
the database.

When i call the update method the second time to change the dataFields i got an 
unique constraint error from the database, because the system is trying to make 
a insert on the relation table!! This is not possible because the necessary 
entry is existing yet.

The server log looks similar to the server log above, but instead of the delete 
statement we have an insert statement.

It's a bit of a strange problem, because this only happens when using a 
listener and setting a field from a MappedSuperclass in there and having a M:N 
relation or a relation which produces a relation table in the database.

Do i something wrong or is this maybe a bug?
Can someone give me a hint?

Thanks for reading my problem.
Roland (Darquerus)

PS: Following workaround exists: Move the field from the MappedSuperclass to 
the entities. After this change i can set the field through the listener and 
everything is okay, also when sending several updates. But i won't move all my 
fields from the MappedSuperclass into my ~150 entities in my big application. :)

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

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

Reply via email to