| Summary: | ManyToMany mapping in aggregate object violate integrity constraint on deletion | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Product: | z_Archived | Reporter: | lotus <iamlotus> | ||||||||||||
| Component: | Eclipselink | Assignee: | Guy Pelletier <guy.pelletier> | ||||||||||||
| Status: | RESOLVED FIXED | QA Contact: | |||||||||||||
| Severity: | normal | ||||||||||||||
| Priority: | P3 | CC: | eclipselink.foundation-inbox, guy.pelletier, tom.ware | ||||||||||||
| Version: | unspecified | ||||||||||||||
| Target Milestone: | --- | ||||||||||||||
| Hardware: | PC | ||||||||||||||
| OS: | Windows XP | ||||||||||||||
| Whiteboard: | |||||||||||||||
| Attachments: |
|
||||||||||||||
We should confirm whether this is a regression, and if so, fix in the next patch. Looking into this. In the mean time, by setting: e2Mapping.setCascadeRemove(true) should get you past the error. Created attachment 199937 [details]
Proposed changes
Alternatively, we could add the AggregateObjectMapping to the preDeleteMappings and have AggregateObjectMapping implement the earlyPreDelete. Thoughts?
Created attachment 199999 [details]
2.3.1 patch
Created attachment 200009 [details]
trunk patch
Changes have been submitted to the 2.2.1, 2.3.1 and trunk streams. Verified by: Gordon Yorke, Andrei Ilitchev Tests: New test (testDeleteObjectWithEmbeddedManyToMany) added to DDLGenerationJUnitTestSuite Created attachment 200103 [details]
Amendment patch for 2.3.1 and trunk
Created attachment 200117 [details]
Amendment patch for 2.2.1
The Eclipselink project has moved to Github: https://github.com/eclipse-ee4j/eclipselink |
Build Identifier: M20090211-1700 I try to use ManyToManyMapping in an aggregate object, when the source object is deleted, EL can not resolve depedency correctly and execute SQL in correct sequence. It should remove record from many-to-many relational table first, then delete from the source table like following DELETE FROM T_E1_E2_REL WHERE (E1_ID = 'E1') DELETE FROM T_E1 WHERE (ID = 'E1') but 'DELETE FROM T_E1_E2_REL WHERE (E1_ID = 'E1')' will not be executed UNLESS I clear the list of source object manually,this will violate the integrity constraint on many-to-many relational table and throw SQL exception This issue does not exist in Toplink 10.1.3.4, I can delete the source object directly without clear its list, it can resolve dependency clearly, all SQL will be executed in correct sequence. ======================TABLE============================== create table T_E1(ID VARCHAR2(20) not null); alter table T_E1 add constraint PK_T_E1 primary key (ID); create table T_E2(ID VARCHAR2(10) not null); alter table T_E2 add constraint PK_T_E2 primary key (ID); create table T_E1_E2_REL(E1_ID VARCHAR2(10) not null,E2_ID VARCHAR2(10) not null); alter table T_E1_E2_REL add constraint PK_T_E1_E2_REL primary key (E1_ID, E2_ID); alter table T_E1_E2_REL add constraint T_E1_E2_REL_E1 foreign key (E1_ID) references T_E1 (ID); alter table T_E1_E2_REL add constraint T_E1_E2_REL_E2 foreign key (E2_ID) references T_E2 (ID); ======================CLASS============================== public class E1 { public String id; public Aggregate aggragate; } public class Aggregate { public List<E2> e2; } public class E2 { public String id; } ======================DESCRIPTOR============================== import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.descriptors.RelationalDescriptor; import org.eclipse.persistence.indirection.IndirectList; import org.eclipse.persistence.mappings.AggregateObjectMapping; import org.eclipse.persistence.mappings.DirectToFieldMapping; import org.eclipse.persistence.mappings.ManyToManyMapping; import org.eclipse.persistence.sessions.DatabaseLogin; import org.eclipse.persistence.sessions.Project; public class EclipseLinkProject extends Project { public EclipseLinkProject() { setName("testm2m_eclipse"); applyLogin(); addDescriptor(buildAggregateDescriptor()); addDescriptor(buildE1Descriptor()); addDescriptor(buildE2Descriptor()); } public void applyLogin() { DatabaseLogin login = new DatabaseLogin(); login .usePlatform(new org.eclipse.persistence.platform.database.oracle.Oracle10Platform()); login.setDriverClassName("oracle.jdbc.OracleDriver"); login.setConnectionString("jdbc:oracle:thin:@localhost:1521:test"); login.setUserName("aeowner"); login.setEncryptedPassword("33249B2910CFF3FB26EA394317DE8928"); // Configuration Properties. setDatasourceLogin(login); } public ClassDescriptor buildAggregateDescriptor() { RelationalDescriptor descriptor = new RelationalDescriptor(); descriptor.descriptorIsAggregate(); descriptor.setJavaClass(Aggregate.class); // Descriptor Properties. descriptor.setAlias("Aggregate"); // Query Manager. // Event Manager. // Mappings. ManyToManyMapping e2Mapping = new ManyToManyMapping(); e2Mapping.setAttributeName("e2"); e2Mapping.setReferenceClass(E2.class); e2Mapping.useTransparentCollection(); e2Mapping.useCollectionClass(IndirectList.class); e2Mapping.setRelationTableName("T_E1_E2_REL"); e2Mapping.addSourceRelationKeyFieldName("T_E1_E2_REL.E1_ID", "T_E1.ID"); e2Mapping.addTargetRelationKeyFieldName("T_E1_E2_REL.E2_ID", "T_E2.ID"); descriptor.addMapping(e2Mapping); return descriptor; } public ClassDescriptor buildE1Descriptor() { RelationalDescriptor descriptor = new RelationalDescriptor(); descriptor.setJavaClass(E1.class); descriptor.addTableName("T_E1"); descriptor.addPrimaryKeyFieldName("T_E1.ID"); // Descriptor Properties. descriptor.useSoftCacheWeakIdentityMap(); descriptor.setIdentityMapSize(100); descriptor.useRemoteSoftCacheWeakIdentityMap(); descriptor.setRemoteIdentityMapSize(100); descriptor.setAlias("E1"); // Query Manager. descriptor.getQueryManager().checkCacheForDoesExist(); // Event Manager. // Mappings. DirectToFieldMapping idMapping = new DirectToFieldMapping(); idMapping.setAttributeName("id"); idMapping.setFieldName("T_E1.ID"); descriptor.addMapping(idMapping); AggregateObjectMapping aggragateMapping = new AggregateObjectMapping(); aggragateMapping.setAttributeName("aggragate"); aggragateMapping.setReferenceClass(Aggregate.class); aggragateMapping.setIsNullAllowed(false); //aggragateMapping.addFieldNameTranslation("T_E1.ID", // "e2->ID_IN_REFERENCE_T_E1_E2_REL_E1"); descriptor.addMapping(aggragateMapping); return descriptor; } public ClassDescriptor buildE2Descriptor() { RelationalDescriptor descriptor = new RelationalDescriptor(); descriptor.setJavaClass(E2.class); descriptor.addTableName("T_E2"); descriptor.addPrimaryKeyFieldName("T_E2.ID"); // Descriptor Properties. descriptor.useSoftCacheWeakIdentityMap(); descriptor.setIdentityMapSize(100); descriptor.useRemoteSoftCacheWeakIdentityMap(); descriptor.setRemoteIdentityMapSize(100); descriptor.setAlias("E2"); // Query Manager. descriptor.getQueryManager().checkCacheForDoesExist(); // Event Manager. // Mappings. DirectToFieldMapping idMapping = new DirectToFieldMapping(); idMapping.setAttributeName("id"); idMapping.setFieldName("T_E2.ID"); descriptor.addMapping(idMapping); return descriptor; } } ======================TEST============================== public class TestEclipseLink { public static void main(String[] args) { EclipseLinkProject project = new EclipseLinkProject(); project.applyLogin(); project.getLogin(); Server server = (Server) project.createServerSession(); server.login(); UnitOfWork uow = server.acquireUnitOfWork(); uow.setLogLevel(1); E1 e1 = new E1(); e1.id = "E1"; E2 e2 = new E2(); e2.id = "E2"; e1.aggragate = new Aggregate(); e1.aggragate.e2 = new ArrayList<E2>(); e1.aggragate.e2.add(e2); uow.registerNewObject(e1); uow.commit(); UnitOfWork uow2 = server.acquireUnitOfWork(); uow2.setLogLevel(1); E1 e = (E1) uow2.readObject(E1.class); // you have to clear list in aggregate manually to avoid violate // integrity constraint // e.aggragate.e2.clear(); uow2.deleteObject(e); uow2.commit(); } } ======================LOG============================= [EL Info]: 2011-03-03 22:04:04.161--ServerSession(13577344)--EclipseLink, version: Eclipse Persistence Services - 2.2.0.v20110202-r8913 [EL Info]: 2011-03-03 22:04:04.817--ServerSession(13577344)-- login successful [EL Finest]: 2011-03-03 22:04:04.848--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Register the new object E1@10e790c [EL Finer]: 2011-03-03 22:04:04.848--UnitOfWork(2614099)--Thread(Thread[main,5,main])--begin unit of work commit [EL Finest]: 2011-03-03 22:04:04.848--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Execute query InsertObjectQuery(E1@10e790c) [EL Finest]: 2011-03-03 22:04:04.848--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default]. [EL Finer]: 2011-03-03 22:04:04.848--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--begin transaction [EL Fine]: 2011-03-03 22:04:04.848--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--INSERT INTO T_E1 (ID) VALUES (?) bind => [E1] [EL Finest]: 2011-03-03 22:04:04.927--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Execute query InsertObjectQuery(E2@1f78ef1) [EL Fine]: 2011-03-03 22:04:04.927--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--INSERT INTO T_E2 (ID) VALUES (?) bind => [E2] [EL Finest]: 2011-03-03 22:04:04.927--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Execute query DataModifyQuery(name="e2" ) [EL Fine]: 2011-03-03 22:04:04.927--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--INSERT INTO T_E1_E2_REL (E2_ID, E1_ID) VALUES (?, ?) bind => [E2, E1] [EL Finer]: 2011-03-03 22:04:04.942--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--commit transaction [EL Finest]: 2011-03-03 22:04:04.942--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection released to connection pool [default]. [EL Finer]: 2011-03-03 22:04:04.942--UnitOfWork(2614099)--Thread(Thread[main,5,main])--end unit of work commit [EL Finer]: 2011-03-03 22:04:04.942--UnitOfWork(2614099)--Thread(Thread[main,5,main])--release unit of work [EL Finer]: 2011-03-03 22:04:04.942--ServerSession(13577344)--Thread(Thread[main,5,main])--client acquired: 9319143 [EL Finer]: 2011-03-03 22:04:04.942--ClientSession(9319143)--Thread(Thread[main,5,main])--acquire unit of work: 28311783 [EL Finest]: 2011-03-03 22:04:04.942--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Execute query ReadObjectQuery(referenceClass=E1 ) [EL Finest]: 2011-03-03 22:04:04.958--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default]. [EL Fine]: 2011-03-03 22:04:04.958--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--SELECT ID FROM T_E1 [EL Finest]: 2011-03-03 22:04:04.973--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection released to connection pool [default]. [EL Finest]: 2011-03-03 22:04:04.989--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Execute query DeleteObjectQuery(E1@c9131c) [EL Finer]: 2011-03-03 22:04:04.989--UnitOfWork(28311783)--Thread(Thread[main,5,main])--begin unit of work commit [EL Finest]: 2011-03-03 22:04:04.989--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Execute query DeleteObjectQuery(E1@c9131c) [EL Finest]: 2011-03-03 22:04:04.989--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default]. [EL Finer]: 2011-03-03 22:04:04.989--ClientSession(9319143)--Connection(19610963)--Thread(Thread[main,5,main])--begin transaction [EL Fine]: 2011-03-03 22:04:05.005--ClientSession(9319143)--Connection(19610963)--Thread(Thread[main,5,main])--DELETE FROM T_E1 WHERE (ID = ?) bind => [E1] [EL Fine]: 2011-03-03 22:04:05.005--ClientSession(9319143)--Thread(Thread[main,5,main])--SELECT 1 FROM DUAL [EL Warning]: 2011-03-03 22:04:05.02--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: ORA-02292: integrity constraint (AEOWNER.T_E1_E2_REL_E1) violated - child record found Error Code: 2292 Call: DELETE FROM T_E1 WHERE (ID = ?) bind => [E1] Query: DeleteObjectQuery(E1@c9131c) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:798) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:864) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:583) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:526) at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1729) at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:234) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteObject(DatasourceCallQueryMechanism.java:184) at org.eclipse.persistence.internal.queries.StatementQueryMechanism.deleteObject(StatementQueryMechanism.java:101) at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:175) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:808) at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:711) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:113) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2842) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1521) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1503) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1463) at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:334) at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:283) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1407) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1511) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitRootUnitOfWork(UnitOfWorkImpl.java:1312) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commit(UnitOfWorkImpl.java:1074) at TestEclipseLink.main(TestEclipseLink.java:41) Caused by: java.sql.SQLException: ORA-02292: integrity constraint (AEOWNER.T_E1_E2_REL_E1) violated - child record found at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:304) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:271) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:625) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181) at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:791) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1032) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2884) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2956) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:789) ... 26 more [EL Finer]: 2011-03-03 22:04:05.02--ClientSession(9319143)--Connection(19610963)--Thread(Thread[main,5,main])--rollback transaction [EL Finest]: 2011-03-03 22:04:05.02--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection released to connection pool [default]. Reproducible: Always Steps to Reproduce: ======================TABLE============================== create table T_E1(ID VARCHAR2(20) not null); alter table T_E1 add constraint PK_T_E1 primary key (ID); create table T_E2(ID VARCHAR2(10) not null); alter table T_E2 add constraint PK_T_E2 primary key (ID); create table T_E1_E2_REL(E1_ID VARCHAR2(10) not null,E2_ID VARCHAR2(10) not null); alter table T_E1_E2_REL add constraint PK_T_E1_E2_REL primary key (E1_ID, E2_ID); alter table T_E1_E2_REL add constraint T_E1_E2_REL_E1 foreign key (E1_ID) references T_E1 (ID); alter table T_E1_E2_REL add constraint T_E1_E2_REL_E2 foreign key (E2_ID) references T_E2 (ID); ======================CLASS============================== public class E1 { public String id; public Aggregate aggragate; } public class Aggregate { public List<E2> e2; } public class E2 { public String id; } ======================DESCRIPTOR============================== import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.descriptors.RelationalDescriptor; import org.eclipse.persistence.indirection.IndirectList; import org.eclipse.persistence.mappings.AggregateObjectMapping; import org.eclipse.persistence.mappings.DirectToFieldMapping; import org.eclipse.persistence.mappings.ManyToManyMapping; import org.eclipse.persistence.sessions.DatabaseLogin; import org.eclipse.persistence.sessions.Project; public class EclipseLinkProject extends Project { public EclipseLinkProject() { setName("testm2m_eclipse"); applyLogin(); addDescriptor(buildAggregateDescriptor()); addDescriptor(buildE1Descriptor()); addDescriptor(buildE2Descriptor()); } public void applyLogin() { DatabaseLogin login = new DatabaseLogin(); login .usePlatform(new org.eclipse.persistence.platform.database.oracle.Oracle10Platform()); login.setDriverClassName("oracle.jdbc.OracleDriver"); login.setConnectionString("jdbc:oracle:thin:@localhost:1521:test"); login.setUserName("aeowner"); login.setEncryptedPassword("33249B2910CFF3FB26EA394317DE8928"); // Configuration Properties. setDatasourceLogin(login); } public ClassDescriptor buildAggregateDescriptor() { RelationalDescriptor descriptor = new RelationalDescriptor(); descriptor.descriptorIsAggregate(); descriptor.setJavaClass(Aggregate.class); // Descriptor Properties. descriptor.setAlias("Aggregate"); // Query Manager. // Event Manager. // Mappings. ManyToManyMapping e2Mapping = new ManyToManyMapping(); e2Mapping.setAttributeName("e2"); e2Mapping.setReferenceClass(E2.class); e2Mapping.useTransparentCollection(); e2Mapping.useCollectionClass(IndirectList.class); e2Mapping.setRelationTableName("T_E1_E2_REL"); e2Mapping.addSourceRelationKeyFieldName("T_E1_E2_REL.E1_ID", "T_E1.ID"); e2Mapping.addTargetRelationKeyFieldName("T_E1_E2_REL.E2_ID", "T_E2.ID"); descriptor.addMapping(e2Mapping); return descriptor; } public ClassDescriptor buildE1Descriptor() { RelationalDescriptor descriptor = new RelationalDescriptor(); descriptor.setJavaClass(E1.class); descriptor.addTableName("T_E1"); descriptor.addPrimaryKeyFieldName("T_E1.ID"); // Descriptor Properties. descriptor.useSoftCacheWeakIdentityMap(); descriptor.setIdentityMapSize(100); descriptor.useRemoteSoftCacheWeakIdentityMap(); descriptor.setRemoteIdentityMapSize(100); descriptor.setAlias("E1"); // Query Manager. descriptor.getQueryManager().checkCacheForDoesExist(); // Event Manager. // Mappings. DirectToFieldMapping idMapping = new DirectToFieldMapping(); idMapping.setAttributeName("id"); idMapping.setFieldName("T_E1.ID"); descriptor.addMapping(idMapping); AggregateObjectMapping aggragateMapping = new AggregateObjectMapping(); aggragateMapping.setAttributeName("aggragate"); aggragateMapping.setReferenceClass(Aggregate.class); aggragateMapping.setIsNullAllowed(false); //aggragateMapping.addFieldNameTranslation("T_E1.ID", // "e2->ID_IN_REFERENCE_T_E1_E2_REL_E1"); descriptor.addMapping(aggragateMapping); return descriptor; } public ClassDescriptor buildE2Descriptor() { RelationalDescriptor descriptor = new RelationalDescriptor(); descriptor.setJavaClass(E2.class); descriptor.addTableName("T_E2"); descriptor.addPrimaryKeyFieldName("T_E2.ID"); // Descriptor Properties. descriptor.useSoftCacheWeakIdentityMap(); descriptor.setIdentityMapSize(100); descriptor.useRemoteSoftCacheWeakIdentityMap(); descriptor.setRemoteIdentityMapSize(100); descriptor.setAlias("E2"); // Query Manager. descriptor.getQueryManager().checkCacheForDoesExist(); // Event Manager. // Mappings. DirectToFieldMapping idMapping = new DirectToFieldMapping(); idMapping.setAttributeName("id"); idMapping.setFieldName("T_E2.ID"); descriptor.addMapping(idMapping); return descriptor; } } ======================TEST============================== public class TestEclipseLink { public static void main(String[] args) { EclipseLinkProject project = new EclipseLinkProject(); project.applyLogin(); project.getLogin(); Server server = (Server) project.createServerSession(); server.login(); UnitOfWork uow = server.acquireUnitOfWork(); uow.setLogLevel(1); E1 e1 = new E1(); e1.id = "E1"; E2 e2 = new E2(); e2.id = "E2"; e1.aggragate = new Aggregate(); e1.aggragate.e2 = new ArrayList<E2>(); e1.aggragate.e2.add(e2); uow.registerNewObject(e1); uow.commit(); UnitOfWork uow2 = server.acquireUnitOfWork(); uow2.setLogLevel(1); E1 e = (E1) uow2.readObject(E1.class); // you have to clear list in aggregate manually to avoid violate // integrity constraint // e.aggragate.e2.clear(); uow2.deleteObject(e); uow2.commit(); } } ======================LOG============================= [EL Info]: 2011-03-03 22:04:04.161--ServerSession(13577344)--EclipseLink, version: Eclipse Persistence Services - 2.2.0.v20110202-r8913 [EL Info]: 2011-03-03 22:04:04.817--ServerSession(13577344)-- login successful [EL Finest]: 2011-03-03 22:04:04.848--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Register the new object E1@10e790c [EL Finer]: 2011-03-03 22:04:04.848--UnitOfWork(2614099)--Thread(Thread[main,5,main])--begin unit of work commit [EL Finest]: 2011-03-03 22:04:04.848--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Execute query InsertObjectQuery(E1@10e790c) [EL Finest]: 2011-03-03 22:04:04.848--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default]. [EL Finer]: 2011-03-03 22:04:04.848--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--begin transaction [EL Fine]: 2011-03-03 22:04:04.848--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--INSERT INTO T_E1 (ID) VALUES (?) bind => [E1] [EL Finest]: 2011-03-03 22:04:04.927--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Execute query InsertObjectQuery(E2@1f78ef1) [EL Fine]: 2011-03-03 22:04:04.927--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--INSERT INTO T_E2 (ID) VALUES (?) bind => [E2] [EL Finest]: 2011-03-03 22:04:04.927--UnitOfWork(2614099)--Thread(Thread[main,5,main])--Execute query DataModifyQuery(name="e2" ) [EL Fine]: 2011-03-03 22:04:04.927--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--INSERT INTO T_E1_E2_REL (E2_ID, E1_ID) VALUES (?, ?) bind => [E2, E1] [EL Finer]: 2011-03-03 22:04:04.942--ClientSession(29839159)--Connection(19610963)--Thread(Thread[main,5,main])--commit transaction [EL Finest]: 2011-03-03 22:04:04.942--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection released to connection pool [default]. [EL Finer]: 2011-03-03 22:04:04.942--UnitOfWork(2614099)--Thread(Thread[main,5,main])--end unit of work commit [EL Finer]: 2011-03-03 22:04:04.942--UnitOfWork(2614099)--Thread(Thread[main,5,main])--release unit of work [EL Finer]: 2011-03-03 22:04:04.942--ServerSession(13577344)--Thread(Thread[main,5,main])--client acquired: 9319143 [EL Finer]: 2011-03-03 22:04:04.942--ClientSession(9319143)--Thread(Thread[main,5,main])--acquire unit of work: 28311783 [EL Finest]: 2011-03-03 22:04:04.942--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Execute query ReadObjectQuery(referenceClass=E1 ) [EL Finest]: 2011-03-03 22:04:04.958--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default]. [EL Fine]: 2011-03-03 22:04:04.958--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--SELECT ID FROM T_E1 [EL Finest]: 2011-03-03 22:04:04.973--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection released to connection pool [default]. [EL Finest]: 2011-03-03 22:04:04.989--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Execute query DeleteObjectQuery(E1@c9131c) [EL Finer]: 2011-03-03 22:04:04.989--UnitOfWork(28311783)--Thread(Thread[main,5,main])--begin unit of work commit [EL Finest]: 2011-03-03 22:04:04.989--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Execute query DeleteObjectQuery(E1@c9131c) [EL Finest]: 2011-03-03 22:04:04.989--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection acquired from connection pool [default]. [EL Finer]: 2011-03-03 22:04:04.989--ClientSession(9319143)--Connection(19610963)--Thread(Thread[main,5,main])--begin transaction [EL Fine]: 2011-03-03 22:04:05.005--ClientSession(9319143)--Connection(19610963)--Thread(Thread[main,5,main])--DELETE FROM T_E1 WHERE (ID = ?) bind => [E1] [EL Fine]: 2011-03-03 22:04:05.005--ClientSession(9319143)--Thread(Thread[main,5,main])--SELECT 1 FROM DUAL [EL Warning]: 2011-03-03 22:04:05.02--UnitOfWork(28311783)--Thread(Thread[main,5,main])--Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: ORA-02292: integrity constraint (AEOWNER.T_E1_E2_REL_E1) violated - child record found Error Code: 2292 Call: DELETE FROM T_E1 WHERE (ID = ?) bind => [E1] Query: DeleteObjectQuery(E1@c9131c) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:798) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:864) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:583) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:526) at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1729) at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:234) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.deleteObject(DatasourceCallQueryMechanism.java:184) at org.eclipse.persistence.internal.queries.StatementQueryMechanism.deleteObject(StatementQueryMechanism.java:101) at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:175) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:808) at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:711) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:113) at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2842) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1521) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1503) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1463) at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:334) at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:283) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1407) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1511) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitRootUnitOfWork(UnitOfWorkImpl.java:1312) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commit(UnitOfWorkImpl.java:1074) at TestEclipseLink.main(TestEclipseLink.java:41) Caused by: java.sql.SQLException: ORA-02292: integrity constraint (AEOWNER.T_E1_E2_REL_E1) violated - child record found at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:304) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:271) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:625) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181) at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:791) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1032) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2884) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2956) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:789) ... 26 more [EL Finer]: 2011-03-03 22:04:05.02--ClientSession(9319143)--Connection(19610963)--Thread(Thread[main,5,main])--rollback transaction [EL Finest]: 2011-03-03 22:04:05.02--ServerSession(13577344)--Connection(19610963)--Thread(Thread[main,5,main])--Connection released to connection pool [default].