package org.eclipse.persistence.testing.tests.simultaneous; import org.eclipse.persistence.internal.identitymaps.CacheKey; import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl; import org.eclipse.persistence.queries.ReadObjectQuery; import org.eclipse.persistence.sessions.Session; import org.eclipse.persistence.testing.models.employee.domain.Employee; import org.eclipse.persistence.testing.models.employee.domain.SmallProject; public class Runner1 implements Runnable { protected Object waitOn; protected Object projPK; protected Object empPK; protected Session session; public Runner1(Object waitOn, Object empPK, Object projPK, Session session) { this.waitOn = waitOn; this.projPK = projPK; this.empPK = empPK; this.session = session; } public void run() { UnitOfWorkImpl uow = (UnitOfWorkImpl)this.session.acquireUnitOfWork(); ReadObjectQuery roq = new ReadObjectQuery(Employee.class); roq.setSelectionCriteria(roq.getExpressionBuilder().get("id").equal(empPK)); Employee emp = (Employee)uow.executeQuery(roq); roq = new ReadObjectQuery(SmallProject.class); roq.setSelectionCriteria(roq.getExpressionBuilder().get("id").equal(projPK)); SmallProject project = (SmallProject)uow.executeQuery(roq); emp.getProjects().add(project); try { Thread.currentThread().sleep(4000); } catch (InterruptedException e) { } uow.issueSQLbeforeCompletion(true); synchronized (this.waitOn) { try { this.waitOn.notify(); this.waitOn.wait(); } catch (InterruptedException e) { } } CacheKey cacheKey = uow.getParent().getIdentityMapAccessorInstance().getCacheKeyForObject(emp); synchronized (cacheKey) { cacheKey.notify(); } try { Thread.currentThread().sleep(4000); } catch (InterruptedException e) { } uow.mergeClonesAfterCompletion(); } }