[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-616) replicate() with a bidirectional relationship fails (dom4j)

Steve Ebersole (JIRA) noreply at atlassian.com
Fri Jan 19 08:14:45 EST 2007


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-616?page=all ]

Steve Ebersole updated HHH-616:
-------------------------------

    Fix Version: entity-modes
                     (was: 3.2.2)

> replicate() with a bidirectional relationship fails (dom4j)
> -----------------------------------------------------------
>
>          Key: HHH-616
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-616
>      Project: Hibernate3
>         Type: Bug

>   Components: core
>     Versions: 3.0.5
>  Environment: Hibernate 3.0.5; MySQL 4.1.12
>     Reporter: David Tashima
>     Assignee: Gavin King
>      Fix For: entity-modes
>  Attachments: test.zip, test3.zip
>
>
> Here is the original forum post:
> http://forum.hibernate.org/viewtopic.php?t=943520
> Basically, I am trying to transfer stuff from one DB to another via the Dom4j session. I create an XML document from the source DB and then I am using session.replicate() on the receiving end to instantiate the new objects from that XML document.
> It works for simple objects, but when I have a bidirectional reference, it is unable to .replicate() the pair of objects, even if I try to commit() them all in the same transaction.
> I have created a simple model to reproduce this.
> Mapping document:
> <hibernate-mapping
>     package="data">
>     <class name="Foo"
>            table="foo"
>            >
>         <id name="id"
>             node="@id"
>             type="string"
>             unsaved-value="null"
>             column="foo_id" >
>             <generator class="uuid" />
>         </id>
>         <property
>             name="prop1"
>             column="prop1"
>             type="string"
>             />
>         <many-to-one
>             name="bar"
>             column="bar_id"
>             class="Bar"
>             not-null="false"
>             embed-xml="false"
>             />
>         <property
>             name="index"
>             column="foo_index"
>             type="int"
>             update="true"
>             />
>      </class>
>     <class name="Bar"
>            table="bar"
>            >
>         <id name="id"
>             node="@id"
>             type="string"
>             unsaved-value="null"
>             column="bar_id" >
>             <generator class="uuid" />
>         </id>
>         <list
>             name="foos"
>             node="foos"
>             embed-xml="true"
>             inverse="true"
>             lazy="false">
>             <key column="bar_id"/>
>             <list-index column="foo_index"/>
>             <one-to-many
>                 class="Foo"
>                 embed-xml="false"
>                 node="foo"
>                 />
>         </list>
>     </class>
> </hibernate-mapping>
> Reconstitution code:
>         try
>         {
>             SAXReader reader = new SAXReader();
>             Document doc = reader.read(new File("content.xml"));
>             Session session = currentSession();
>             Session s = session.getSession(EntityMode.DOM4J);
>             Transaction txn = s.beginTransaction();
>             {
>                 List elems = doc.getRootElement().elements();
>                 Iterator it = elems.iterator();
>                 while(it.hasNext())
>                 {
>                     Element e = (Element)it.next();
>                     log.debug(e.getName());
>                     if(e.getName().equals("Foo"))
>                         s.replicate("data.Foo",e, ReplicationMode.IGNORE);
>                     if(e.getName().equals("Bar"))
>                         s.replicate("data.Bar",e, ReplicationMode.IGNORE);
>                 }
>             }
>             txn.commit();
>         }
>         catch(DocumentException e)
>         {
>             log.error(e);
>         } 
> Here is the stack trace:
> 150 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Cannot add or update a child row: a foreign key constraint fails
> 291 [main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
> org.hibernate.exception.ConstraintViolationException: could not insert: [data.Foo]
> at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:74)
> at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
> at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869)
> at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200)
> at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
> at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
> at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
> at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
> at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
> at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
> at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
> at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:329)
> at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
> at Test.reconstitute(Test.java:69)
> at Test.main(Test.java:40)
> 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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)
> Caused by: java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails
> at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2851)
> at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1531)
> at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1366)
> at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:952)
> at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1974)
> at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1897)
> at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1758)
> at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)
> at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1853)
> ... 17 more
> Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not insert: [data.Foo]
> at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:74)
> at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
> at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869)
> at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200)
> at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
> at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
> at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
> at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
> at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
> at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
> at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
> at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:329)
> at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
> at Test.reconstitute(Test.java:69)
> at Test.main(Test.java:40) 
> And finally, here is the XML document I am attempting to reconstitute:
> <root>
>   <Foo id="402881e4045ce90c01045ce90f950002">
>     <prop1>abcd</prop1>
>     <bar>402881e4045ce90c01045ce90f770001</bar>
>     <index>0</index>
>   </Foo>
>   <Foo id="402881e4045ce90c01045ce90f9f0003">
>     <prop1>456</prop1>
>     <bar>402881e4045ce90c01045ce90f770001</bar>
>     <index>1</index>
>   </Foo>
>   <Bar id="402881e4045ce90c01045ce90f770001">
>     <foos>
>       <foo>402881e4045ce90c01045ce90f950002</foo>
>       <foo>402881e4045ce90c01045ce90f9f0003</foo>
>     </foos>
>   </Bar>
> </root>

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list