Hi,
I have detached object graph that I try to merge.
One of detached entities in this graph is removed and replaced with new entity (which is not presented in DB yet). Removed and new entity cannot exist in the database in the same time due to existing constraint, so first deleted object should be deleted from DB, the new one should be inserted. In reality, Hibernate first tries to insert new object and it fails on constraint.
I put all needed DELETE_ORPHANS.
When I've checked in the debugger, I see that during commit, it reaches ActionQueue.executeActions(). Though object to be deleted is presented in 'deletions' list, first insertions are executed, and it predictable fails. Is it bug in Hibernate, or I should use some additional flags?
Object relations:
Code:
Process
/ \
Cascade.All / \ Cascade.All
Cascade.DELETE_ORPH / \ Cascade.DELETE_ORPH
/ \
/ \
/ \
Node------- Cascade.ALL ------ Link
I replace entity of type Link with new one and remove old from all relevant collections - Process.getLinks() and Node. getLinks(), so object graph is consistent before merge(Process)
Thanks in advance,
Igor
Hibernate version:3.1 Code between sessionFactory.openSession() and session.close():Process process = processFromXml(); // recreate Process graph from XML
session.merge(process);
Full stack trace of any exception that occurs:13:57:13,734 DEBUG SQL:393 - insert into abm_process_link (from_node, to_node, label, process, id) values (?, ?, ?, ?, ?)
Hibernate: insert into abm_process_link (from_node, to_node, label, process, id) values (?, ?, ?, ?, ?)
13:57:13,796 WARN JDBCExceptionReporter:71 - SQL Error: 1, SQLState: 23000
13:57:13,796 ERROR JDBCExceptionReporter:72 - ORA-00001: unique constraint (EX_ABM.ABM_PROCESS_LINK_ENDS_UK) violated
13:57:13,796 WARN JDBCExceptionReporter:71 - SQL Error: 1, SQLState: 23000
13:57:13,796 ERROR JDBCExceptionReporter:72 - ORA-00001: unique constraint (EX_ABM.ABM_PROCESS_LINK_ENDS_UK) violated
13:57:13,812 ERROR AbstractFlushingEventListener:300 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:988)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:337)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at exactcost.abm.bl.entity.process.ProcessTest.testImportProcess(ProcessTest.java:455)
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 junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (EX_ABM.ABM_PROCESS_LINK_ENDS_UK) violated
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10656)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
... 21 more
Name and version of the database you are using:Oracle9iDebug level Hibernate log excerpt:EL(mt:VAATTRIBUTE): Method: public void exactcost.abm.bl.entity.process.Process.setVaAttribute(exactcost.abm.bl.entity.process.ValueAnalysisAttr)Curr Values: []; currValue: null
13:57:13,000 DEBUG SQL:393 - select process0_.id as id6_2_, process0_.ver_id as ver2_6_2_, process0_.distinction as distinc12_7_2_, process0_.intencity as intencity7_2_, process0_.is_nva as is2_7_2_, process0_.resolution as resolution7_2_, process0_.base_volume as base4_7_2_, process0_.diff_measure as diff5_7_2_, process0_.orgid as orgid7_2_, process0_.orgunit as orgunit7_2_, process0_.trigger_action as trigger7_7_2_, process0_.version_number as version8_7_2_, process0_.name as name7_2_, process0_.description as descrip10_7_2_, process0_.status as status7_2_, nodes1_.process as process4_, nodes1_.id as id4_, nodes1_.id as id4_0_, nodes1_.process as process4_0_, nodes1_.left_pos as left3_4_0_, nodes1_.top_pos as top4_4_0_, nodes1_.name as name4_0_, nodes1_.ver_id as ver6_4_0_, nodes1_.cost as cost4_0_, nodes1_.duration as duration4_0_, nodes1_.percent_of_process as percent9_4_0_, nodes1_.distinction as distinc15_4_0_, nodes1_.intencity as intencity4_0_, nodes1_.is_nva as is11_4_0_, nodes1_.resolution as resolution4_0_, nodes1_.in_process_volume as in13_4_0_, nodes1_.origin_activity as origin16_4_0_, nodes1_.origin_process as origin17_4_0_, nodes1_.type as type4_0_, inlinks2_.to_node as to4_5_, inlinks2_.id as id5_, inlinks2_.id as id5_1_, inlinks2_.from_node as from3_5_1_, inlinks2_.to_node as to4_5_1_, inlinks2_.process as process5_1_, inlinks2_.label as label5_1_ from abm_process process0_ left outer join abm_process_node nodes1_ on process0_.id=nodes1_.process left outer join abm_process_link inlinks2_ on nodes1_.id=inlinks2_.to_node where process0_.id=?
Hibernate: select process0_.id as id6_2_, process0_.ver_id as ver2_6_2_, process0_.distinction as distinc12_7_2_, process0_.intencity as intencity7_2_, process0_.is_nva as is2_7_2_, process0_.resolution as resolution7_2_, process0_.base_volume as base4_7_2_, process0_.diff_measure as diff5_7_2_, process0_.orgid as orgid7_2_, process0_.orgunit as orgunit7_2_, process0_.trigger_action as trigger7_7_2_, process0_.version_number as version8_7_2_, process0_.name as name7_2_, process0_.description as descrip10_7_2_, process0_.status as status7_2_, nodes1_.process as process4_, nodes1_.id as id4_, nodes1_.id as id4_0_, nodes1_.process as process4_0_, nodes1_.left_pos as left3_4_0_, nodes1_.top_pos as top4_4_0_, nodes1_.name as name4_0_, nodes1_.ver_id as ver6_4_0_, nodes1_.cost as cost4_0_, nodes1_.duration as duration4_0_, nodes1_.percent_of_process as percent9_4_0_, nodes1_.distinction as distinc15_4_0_, nodes1_.intencity as intencity4_0_, nodes1_.is_nva as is11_4_0_, nodes1_.resolution as resolution4_0_, nodes1_.in_process_volume as in13_4_0_, nodes1_.origin_activity as origin16_4_0_, nodes1_.origin_process as origin17_4_0_, nodes1_.type as type4_0_, inlinks2_.to_node as to4_5_, inlinks2_.id as id5_, inlinks2_.id as id5_1_, inlinks2_.from_node as from3_5_1_, inlinks2_.to_node as to4_5_1_, inlinks2_.process as process5_1_, inlinks2_.label as label5_1_ from abm_process process0_ left outer join abm_process_node nodes1_ on process0_.id=nodes1_.process left outer join abm_process_link inlinks2_ on nodes1_.id=inlinks2_.to_node where process0_.id=?
13:57:13,500 DEBUG SQL:393 - select anattribut0_.process as process1_, anattribut0_.attribute as attribute1_, analysisat1_.id as id1_0_, analysisat1_.orgid as orgid1_0_, analysisat1_.name as name1_0_, analysisat1_.ver_id as ver4_1_0_, analysisat1_.description as descript5_1_0_ from abm_process_attribute anattribut0_ left outer join abm_attribute analysisat1_ on anattribut0_.attribute=analysisat1_.id where anattribut0_.process=?
Hibernate: select anattribut0_.process as process1_, anattribut0_.attribute as attribute1_, analysisat1_.id as id1_0_, analysisat1_.orgid as orgid1_0_, analysisat1_.name as name1_0_, analysisat1_.ver_id as ver4_1_0_, analysisat1_.description as descript5_1_0_ from abm_process_attribute anattribut0_ left outer join abm_attribute analysisat1_ on anattribut0_.attribute=analysisat1_.id where anattribut0_.process=?
13:57:13,546 DEBUG SQL:393 - select sq_activity.nextval from dual
Hibernate: select sq_activity.nextval from dual
13:57:13,609 DEBUG SQL:393 - select outlinks0_.from_node as from3_5_, outlinks0_.id as id5_, outlinks0_.id as id5_4_, outlinks0_.from_node as from3_5_4_, outlinks0_.to_node as to4_5_4_, outlinks0_.process as process5_4_, outlinks0_.label as label5_4_, abstractno1_.id as id4_0_, abstractno1_.process as process4_0_, abstractno1_.left_pos as left3_4_0_, abstractno1_.top_pos as top4_4_0_, abstractno1_.name as name4_0_, abstractno1_.ver_id as ver6_4_0_, abstractno1_.cost as cost4_0_, abstractno1_.duration as duration4_0_, abstractno1_.percent_of_process as percent9_4_0_, abstractno1_.distinction as distinc15_4_0_, abstractno1_.intencity as intencity4_0_, abstractno1_.is_nva as is11_4_0_, abstractno1_.resolution as resolution4_0_, abstractno1_.in_process_volume as in13_4_0_, abstractno1_.origin_activity as origin16_4_0_, abstractno1_.origin_process as origin17_4_0_, abstractno1_.type as type4_0_, process2_.id as id6_1_, process2_.ver_id as ver2_6_1_, process2_.distinction as distinc12_7_1_, process2_.intencity as intencity7_1_, process2_.is_nva as is2_7_1_, process2_.resolution as resolution7_1_, process2_.base_volume as base4_7_1_, process2_.diff_measure as diff5_7_1_, process2_.orgid as orgid7_1_, process2_.orgunit as orgunit7_1_, process2_.trigger_action as trigger7_7_1_, process2_.version_number as version8_7_1_, process2_.name as name7_1_, process2_.description as descrip10_7_1_, process2_.status as status7_1_, abstractpr3_.id as id6_2_, abstractpr3_.ver_id as ver2_6_2_, abstractpr3_.distinction as distinc12_7_2_, abstractpr3_.intencity as intencity7_2_, abstractpr3_.is_nva as is2_7_2_, abstractpr3_.resolution as resolution7_2_, abstractpr3_.base_volume as base4_7_2_, abstractpr3_.diff_measure as diff5_7_2_, abstractpr3_.orgid as orgid7_2_, abstractpr3_.orgunit as orgunit7_2_, abstractpr3_.trigger_action as trigger7_7_2_, abstractpr3_.version_number as version8_7_2_, abstractpr3_.name as name7_2_, abstractpr3_.description as descrip10_7_2_, abstractpr3_.status as status7_2_, abstractpr3_.parent as parent8_2_, abstractpr3_.clazz_ as clazz_2_, subactivit4_.id as id4_3_, subactivit4_.process as process4_3_, subactivit4_.left_pos as left3_4_3_, subactivit4_.top_pos as top4_4_3_, subactivit4_.name as name4_3_, subactivit4_.ver_id as ver6_4_3_, subactivit4_.cost as cost4_3_, subactivit4_.duration as duration4_3_, subactivit4_.percent_of_process as percent9_4_3_, subactivit4_.distinction as distinc15_4_3_, subactivit4_.intencity as intencity4_3_, subactivit4_.is_nva as is11_4_3_, subactivit4_.resolution as resolution4_3_, subactivit4_.in_process_volume as in13_4_3_, subactivit4_.origin_activity as origin16_4_3_, subactivit4_.type as type4_3_ from abm_process_link outlinks0_ inner join abm_process_node abstractno1_ on outlinks0_.to_node=abstractno1_.id left outer join abm_process process2_ on abstractno1_.origin_process=process2_.id inner join ( select base_volume, orgid, trigger_action, resolution, status, id, orgunit, diff_measure, distinction, intencity, description, version_number, ver_id, name, null as parent, is_nva, 1 as clazz_ from abm_process union all select null as base_volume, null as orgid, null as trigger_action, null as resolution, null as status, id, null as orgunit, null as diff_measure, null as distinction, null as intencity, null as description, null as version_number, ver_id, null as name, parent, null as is_nva, 2 as clazz_ from abm_subprocess ) abstractpr3_ on outlinks0_.process=abstractpr3_.id left outer join abm_process_node subactivit4_ on abstractpr3_.parent=subactivit4_.id where outlinks0_.from_node in (?, ?)
Hibernate: select outlinks0_.from_node as from3_5_, outlinks0_.id as id5_, outlinks0_.id as id5_4_, outlinks0_.from_node as from3_5_4_, outlinks0_.to_node as to4_5_4_, outlinks0_.process as process5_4_, outlinks0_.label as label5_4_, abstractno1_.id as id4_0_, abstractno1_.process as process4_0_, abstractno1_.left_pos as left3_4_0_, abstractno1_.top_pos as top4_4_0_, abstractno1_.name as name4_0_, abstractno1_.ver_id as ver6_4_0_, abstractno1_.cost as cost4_0_, abstractno1_.duration as duration4_0_, abstractno1_.percent_of_process as percent9_4_0_, abstractno1_.distinction as distinc15_4_0_, abstractno1_.intencity as intencity4_0_, abstractno1_.is_nva as is11_4_0_, abstractno1_.resolution as resolution4_0_, abstractno1_.in_process_volume as in13_4_0_, abstractno1_.origin_activity as origin16_4_0_, abstractno1_.origin_process as origin17_4_0_, abstractno1_.type as type4_0_, process2_.id as id6_1_, process2_.ver_id as ver2_6_1_, process2_.distinction as distinc12_7_1_, process2_.intencity as intencity7_1_, process2_.is_nva as is2_7_1_, process2_.resolution as resolution7_1_, process2_.base_volume as base4_7_1_, process2_.diff_measure as diff5_7_1_, process2_.orgid as orgid7_1_, process2_.orgunit as orgunit7_1_, process2_.trigger_action as trigger7_7_1_, process2_.version_number as version8_7_1_, process2_.name as name7_1_, process2_.description as descrip10_7_1_, process2_.status as status7_1_, abstractpr3_.id as id6_2_, abstractpr3_.ver_id as ver2_6_2_, abstractpr3_.distinction as distinc12_7_2_, abstractpr3_.intencity as intencity7_2_, abstractpr3_.is_nva as is2_7_2_, abstractpr3_.resolution as resolution7_2_, abstractpr3_.base_volume as base4_7_2_, abstractpr3_.diff_measure as diff5_7_2_, abstractpr3_.orgid as orgid7_2_, abstractpr3_.orgunit as orgunit7_2_, abstractpr3_.trigger_action as trigger7_7_2_, abstractpr3_.version_number as version8_7_2_, abstractpr3_.name as name7_2_, abstractpr3_.description as descrip10_7_2_, abstractpr3_.status as status7_2_, abstractpr3_.parent as parent8_2_, abstractpr3_.clazz_ as clazz_2_, subactivit4_.id as id4_3_, subactivit4_.process as process4_3_, subactivit4_.left_pos as left3_4_3_, subactivit4_.top_pos as top4_4_3_, subactivit4_.name as name4_3_, subactivit4_.ver_id as ver6_4_3_, subactivit4_.cost as cost4_3_, subactivit4_.duration as duration4_3_, subactivit4_.percent_of_process as percent9_4_3_, subactivit4_.distinction as distinc15_4_3_, subactivit4_.intencity as intencity4_3_, subactivit4_.is_nva as is11_4_3_, subactivit4_.resolution as resolution4_3_, subactivit4_.in_process_volume as in13_4_3_, subactivit4_.origin_activity as origin16_4_3_, subactivit4_.type as type4_3_ from abm_process_link outlinks0_ inner join abm_process_node abstractno1_ on outlinks0_.to_node=abstractno1_.id left outer join abm_process process2_ on abstractno1_.origin_process=process2_.id inner join ( select base_volume, orgid, trigger_action, resolution, status, id, orgunit, diff_measure, distinction, intencity, description, version_number, ver_id, name, null as parent, is_nva, 1 as clazz_ from abm_process union all select null as base_volume, null as orgid, null as trigger_action, null as resolution, null as status, id, null as orgunit, null as diff_measure, null as distinction, null as intencity, null as description, null as version_number, ver_id, null as name, parent, null as is_nva, 2 as clazz_ from abm_subprocess ) abstractpr3_ on outlinks0_.process=abstractpr3_.id left outer join abm_process_node subactivit4_ on abstractpr3_.parent=subactivit4_.id where outlinks0_.from_node in (?, ?)
13:57:13,671 DEBUG SQL:393 - select links0_.process as process4_, links0_.id as id4_, links0_.id as id5_3_, links0_.from_node as from3_5_3_, links0_.to_node as to4_5_3_, links0_.process as process5_3_, links0_.label as label5_3_, abstractno1_.id as id4_0_, abstractno1_.process as process4_0_, abstractno1_.left_pos as left3_4_0_, abstractno1_.top_pos as top4_4_0_, abstractno1_.name as name4_0_, abstractno1_.ver_id as ver6_4_0_, abstractno1_.cost as cost4_0_, abstractno1_.duration as duration4_0_, abstractno1_.percent_of_process as percent9_4_0_, abstractno1_.distinction as distinc15_4_0_, abstractno1_.intencity as intencity4_0_, abstractno1_.is_nva as is11_4_0_, abstractno1_.resolution as resolution4_0_, abstractno1_.in_process_volume as in13_4_0_, abstractno1_.origin_activity as origin16_4_0_, abstractno1_.origin_process as origin17_4_0_, abstractno1_.type as type4_0_, process2_.id as id6_1_, process2_.ver_id as ver2_6_1_, process2_.distinction as distinc12_7_1_, process2_.intencity as intencity7_1_, process2_.is_nva as is2_7_1_, process2_.resolution as resolution7_1_, process2_.base_volume as base4_7_1_, process2_.diff_measure as diff5_7_1_, process2_.orgid as orgid7_1_, process2_.orgunit as orgunit7_1_, process2_.trigger_action as trigger7_7_1_, process2_.version_number as version8_7_1_, process2_.name as name7_1_, process2_.description as descrip10_7_1_, process2_.status as status7_1_, abstractno3_.id as id4_2_, abstractno3_.process as process4_2_, abstractno3_.left_pos as left3_4_2_, abstractno3_.top_pos as top4_4_2_, abstractno3_.name as name4_2_, abstractno3_.ver_id as ver6_4_2_, abstractno3_.cost as cost4_2_, abstractno3_.duration as duration4_2_, abstractno3_.percent_of_process as percent9_4_2_, abstractno3_.distinction as distinc15_4_2_, abstractno3_.intencity as intencity4_2_, abstractno3_.is_nva as is11_4_2_, abstractno3_.resolution as resolution4_2_, abstractno3_.in_process_volume as in13_4_2_, abstractno3_.origin_activity as origin16_4_2_, abstractno3_.origin_process as origin17_4_2_, abstractno3_.type as type4_2_ from abm_process_link links0_ inner join abm_process_node abstractno1_ on links0_.from_node=abstractno1_.id left outer join abm_process process2_ on abstractno1_.origin_process=process2_.id inner join abm_process_node abstractno3_ on links0_.to_node=abstractno3_.id where links0_.process=?
Hibernate: select links0_.process as process4_, links0_.id as id4_, links0_.id as id5_3_, links0_.from_node as from3_5_3_, links0_.to_node as to4_5_3_, links0_.process as process5_3_, links0_.label as label5_3_, abstractno1_.id as id4_0_, abstractno1_.process as process4_0_, abstractno1_.left_pos as left3_4_0_, abstractno1_.top_pos as top4_4_0_, abstractno1_.name as name4_0_, abstractno1_.ver_id as ver6_4_0_, abstractno1_.cost as cost4_0_, abstractno1_.duration as duration4_0_, abstractno1_.percent_of_process as percent9_4_0_, abstractno1_.distinction as distinc15_4_0_, abstractno1_.intencity as intencity4_0_, abstractno1_.is_nva as is11_4_0_, abstractno1_.resolution as resolution4_0_, abstractno1_.in_process_volume as in13_4_0_, abstractno1_.origin_activity as origin16_4_0_, abstractno1_.origin_process as origin17_4_0_, abstractno1_.type as type4_0_, process2_.id as id6_1_, process2_.ver_id as ver2_6_1_, process2_.distinction as distinc12_7_1_, process2_.intencity as intencity7_1_, process2_.is_nva as is2_7_1_, process2_.resolution as resolution7_1_, process2_.base_volume as base4_7_1_, process2_.diff_measure as diff5_7_1_, process2_.orgid as orgid7_1_, process2_.orgunit as orgunit7_1_, process2_.trigger_action as trigger7_7_1_, process2_.version_number as version8_7_1_, process2_.name as name7_1_, process2_.description as descrip10_7_1_, process2_.status as status7_1_, abstractno3_.id as id4_2_, abstractno3_.process as process4_2_, abstractno3_.left_pos as left3_4_2_, abstractno3_.top_pos as top4_4_2_, abstractno3_.name as name4_2_, abstractno3_.ver_id as ver6_4_2_, abstractno3_.cost as cost4_2_, abstractno3_.duration as duration4_2_, abstractno3_.percent_of_process as percent9_4_2_, abstractno3_.distinction as distinc15_4_2_, abstractno3_.intencity as intencity4_2_, abstractno3_.is_nva as is11_4_2_, abstractno3_.resolution as resolution4_2_, abstractno3_.in_process_volume as in13_4_2_, abstractno3_.origin_activity as origin16_4_2_, abstractno3_.origin_process as origin17_4_2_, abstractno3_.type as type4_2_ from abm_process_link links0_ inner join abm_process_node abstractno1_ on links0_.from_node=abstractno1_.id left outer join abm_process process2_ on abstractno1_.origin_process=process2_.id inner join abm_process_node abstractno3_ on links0_.to_node=abstractno3_.id where links0_.process=?
new pid: 97950 name: er
13:57:13,734 DEBUG SQL:393 - insert into abm_process_link (from_node, to_node, label, process, id) values (?, ?, ?, ?, ?)
Hibernate: insert into abm_process_link (from_node, to_node, label, process, id) values (?, ?, ?, ?, ?)
13:57:13,796 WARN JDBCExceptionReporter:71 - SQL Error: 1, SQLState: 23000
13:57:13,796 ERROR JDBCExceptionReporter:72 - ORA-00001: unique constraint (EX_ABM.ABM_PROCESS_LINK_ENDS_UK) violated
13:57:13,796 WARN JDBCExceptionReporter:71 - SQL Error: 1, SQLState: 23000
13:57:13,796 ERROR JDBCExceptionReporter:72 - ORA-00001: unique constraint (EX_ABM.ABM_PROCESS_LINK_ENDS_UK) violated
13:57:13,812 ERROR AbstractFlushingEventListener:300 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Code: