blob: 9d3c9c7217a02305f5afcd9f83fa3fabd5b3dacd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.testing.tests.unitofwork;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.AutoVerifyTestCase;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.PhoneNumber;
//Bug4736360 A new clone from parent UOW should only be registered once in a nested UOW
public class NestedUOWWithNewObjectRegisteredTwiceTest extends AutoVerifyTestCase {
public NestedUOWWithNewObjectRegisteredTwiceTest() {
setDescription("");
}
String firstName;
String areaCode;
PhoneNumber pNT02REL;
PhoneNumber pNT02REG;
public void setup() {
getAbstractSession().beginTransaction();
firstName = "Master_" + System.currentTimeMillis();
areaCode = "617";
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee emp = (Employee)uow.registerObject(new Employee());
emp.setFirstName(firstName);
uow.commit();
}
public void reset() {
getAbstractSession().rollbackTransaction();
}
public void test() {
Employee empRO =
(Employee)getSession().readObject(Employee.class, new ExpressionBuilder().get("firstName").equal(firstName));
// start transaction T0
UnitOfWork uowT0 = getSession().acquireUnitOfWork();
Employee empT0 = (Employee)uowT0.registerObject(empRO);
// create phone number and commit in a nested unit of work
UnitOfWork uowT01 = uowT0.acquireUnitOfWork();
Employee empT01 = (Employee)uowT01.registerObject(empT0);
PhoneNumber pN = (PhoneNumber)uowT01.registerObject(new PhoneNumber());
pN.setAreaCode(areaCode);
empT01.addPhoneNumber(pN);
uowT01.commit();
// the phone number is a new object in uowT0
PhoneNumber pNT0 = (PhoneNumber)empT0.getPhoneNumbers().get(0);
// start another nested unit of work
UnitOfWork uowT02 = uowT0.acquireUnitOfWork();
uowT02.setShouldNewObjectsBeCached(true);
// load empT0 from the parent cache and clone and register it
Employee empT02 = (Employee)uowT02.registerObject(empT0);
// get detail via relation. this will trigger the value holder and clone and register phone number in uowT02
pNT02REL = (PhoneNumber)empT02.getPhoneNumbers().get(0);
// get detail via registration. this should return the same clone as referenced by pNT02REL
pNT02REG = (PhoneNumber)uowT02.registerObject(pNT0);
uowT0.commit();
}
protected void verify() {
if (pNT02REL != pNT02REG) {
throw new TestErrorException("PhoneNumber is registered twice in the nested unit of work");
}
}
}