Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 338812

Summary: ManyToMany mapping in aggregate object violate integrity constraint on deletion
Product: z_Archived Reporter: lotus <iamlotus>
Component: EclipselinkAssignee: 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:
Description Flags
Proposed changes
none
2.3.1 patch
none
trunk patch
none
Amendment patch for 2.3.1 and trunk
none
Amendment patch for 2.2.1 none

Description lotus CLA 2011-03-03 09:09:23 EST
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].
Comment 1 Tom Ware CLA 2011-03-18 09:40:29 EDT
We should confirm whether this is a regression, and if so, fix in the next patch.
Comment 2 Guy Pelletier CLA 2011-07-18 14:04:56 EDT
Looking into this. In the mean time, by setting:

e2Mapping.setCascadeRemove(true)

should get you past the error.
Comment 3 Guy Pelletier CLA 2011-07-19 14:56:36 EDT
Created attachment 199937 [details]
Proposed changes

Alternatively, we could add the AggregateObjectMapping to the preDeleteMappings and have AggregateObjectMapping implement the earlyPreDelete. Thoughts?
Comment 4 Guy Pelletier CLA 2011-07-20 09:42:26 EDT
Created attachment 199999 [details]
2.3.1 patch
Comment 5 Guy Pelletier CLA 2011-07-20 10:59:50 EDT
Created attachment 200009 [details]
trunk patch
Comment 6 Guy Pelletier CLA 2011-07-20 11:36:20 EDT
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
Comment 7 Guy Pelletier CLA 2011-07-21 11:43:56 EDT
Created attachment 200103 [details]
Amendment patch for 2.3.1 and trunk
Comment 8 Guy Pelletier CLA 2011-07-21 14:53:23 EDT
Created attachment 200117 [details]
Amendment patch for 2.2.1
Comment 9 Eclipse Webmaster CLA 2022-06-09 10:02:29 EDT
The Eclipselink project has moved to Github: https://github.com/eclipse-ee4j/eclipselink