package testing; | |
import static junit.framework.Assert.*; | |
import java.util.List; | |
import javax.persistence.*; | |
import junit.framework.Assert; | |
import model.*; | |
import org.eclipse.persistence.config.QueryHints; | |
import org.eclipse.persistence.indirection.IndirectContainer; | |
import org.eclipse.persistence.indirection.ValueHolderInterface; | |
import org.eclipse.persistence.internal.indirection.BatchValueHolder; | |
import org.eclipse.persistence.internal.weaving.PersistenceWeaved; | |
import org.eclipse.persistence.jpa.JpaHelper; | |
import org.eclipse.persistence.mappings.*; | |
import org.eclipse.persistence.sessions.Session; | |
import org.eclipse.persistence.sessions.server.Server; | |
import org.junit.Test; | |
@PersistenceContext(unitName = "employee") | |
public class RWUOWInBatchValueHolder extends EclipseLinkJPATest { | |
@Test | |
public void newEmpPersistRefreshBatch() throws Exception { | |
Server session = JpaHelper.getServerSession(getEMF()); | |
session.getIdentityMapAccessor().initializeAllIdentityMaps(); | |
EntityManager em = getEntityManager(); | |
em.getTransaction().begin(); | |
JpaHelper.getEntityManager(em).getUnitOfWork().beginEarlyTransaction(); | |
Employee newEmp = new Employee(); | |
newEmp.setFirstName("test"); | |
newEmp.setLastName("test"); | |
newEmp.setGender(Gender.Male); | |
Address newAddr = new Address(); | |
newEmp.setAddress(newAddr); | |
em.persist(newEmp); | |
em.flush(); | |
Query q = em.createQuery("SELECT e FROM Employee e WHERE e.id = " + newEmp.getId()); | |
q.setHint(QueryHints.REFRESH, "true"); | |
q.setHint(QueryHints.BATCH, "e.address"); | |
q.setHint(QueryHints.BATCH, "e.phoneNumbers"); | |
q.getResultList(); | |
em.getTransaction().commit(); | |
em.clear(); | |
verify(em, session, "newEmpPersistRefreshBatch"); | |
} | |
@Test | |
public void queryOutsideTX() throws Exception { | |
Server session = JpaHelper.getServerSession(getEMF()); | |
session.getIdentityMapAccessor().initializeAllIdentityMaps(); | |
EntityManager em = getEntityManager(); | |
verify(em, session, "queryOutsideTX"); | |
} | |
@Test | |
public void queryInsideTX() throws Exception { | |
Server session = JpaHelper.getServerSession(getEMF()); | |
session.getIdentityMapAccessor().initializeAllIdentityMaps(); | |
EntityManager em = getEntityManager(); | |
em.getTransaction().begin(); | |
verify(em, session, "queryInsideTX"); | |
em.getTransaction().rollback(); | |
} | |
@Test | |
public void queryInsideDBTX() throws Exception { | |
Server session = JpaHelper.getServerSession(getEMF()); | |
session.getIdentityMapAccessor().initializeAllIdentityMaps(); | |
EntityManager em = getEntityManager(); | |
em.getTransaction().begin(); | |
JpaHelper.getEntityManager(em).getUnitOfWork().beginEarlyTransaction(); | |
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.id"); | |
query.setHint(QueryHints.BATCH, "e.address"); | |
query.setHint(QueryHints.BATCH, "e.phoneNumbers"); | |
query.getResultList(); | |
em.getTransaction().commit(); | |
verify(em, session, "queryInsideDBTX"); | |
} | |
@SuppressWarnings("unchecked") | |
private void verify(EntityManager em, Server session, String testCaseName) { | |
// Verify Configuration | |
assertWoven("Employee"); | |
assertLazy("Employee", "address"); | |
assertLazy("Employee", "phoneNumbers"); | |
// em.getTransaction().begin(); | |
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.id"); | |
query.setHint(QueryHints.BATCH, "e.address"); | |
query.setHint(QueryHints.BATCH, "e.phoneNumbers"); | |
List<Employee> emps = query.getResultList(); | |
assertNotNull(emps); | |
assertTrue(emps.size() > 0); | |
OneToOneMapping addressMapping = getMapping("Employee", "address", OneToOneMapping.class); | |
OneToManyMapping phonesMapping = getMapping("Employee", "phoneNumbers", OneToManyMapping.class); | |
for (Employee emp : emps) { | |
Employee sharedEmp = (Employee) session.getIdentityMapAccessor().getFromIdentityMap(emp); | |
assertNotNull("Shared instance not found in cache: " + emp, sharedEmp); | |
assertNotSame(emp, sharedEmp); | |
System.out.println(testCaseName + "::verifying: Employee(" + sharedEmp.getId() + ") @ " + System.identityHashCode(sharedEmp)); | |
ValueHolderInterface addressHolder = (ValueHolderInterface) addressMapping.getAttributeValueFromObject(sharedEmp); | |
assertNotNull("No address holder found Employee id:" + sharedEmp.getId(), addressHolder); | |
assertTrue("address holder not batch: " + addressHolder, addressHolder instanceof BatchValueHolder); | |
BatchValueHolder addressBVH = (BatchValueHolder) addressHolder; | |
assertFalse(addressBVH.isInstantiated()); | |
assertSame(session, addressBVH.getSession()); | |
Session querySession = addressBVH.getQuery().getSession(); | |
if (querySession != null) { | |
assertSame(session, querySession); | |
assertFalse(querySession.isUnitOfWork()); | |
} else { | |
System.out.println("Employee(" + sharedEmp.getId() + ") has null session in address.BVH.query"); | |
} | |
addressBVH.getValue(); | |
assertTrue(addressBVH.isInstantiated()); | |
assertNull(addressBVH.getSession()); | |
assertNull(addressBVH.getQuery()); | |
IndirectContainer phonesContainer = (IndirectContainer) phonesMapping.getAttributeValueFromObject(sharedEmp); | |
ValueHolderInterface phonesHolder = phonesContainer.getValueHolder(); | |
assertNotNull("No phones holder found Employee id:" + sharedEmp.getId(), phonesHolder); | |
assertTrue("phones holder not batch: " + phonesHolder, phonesHolder instanceof BatchValueHolder); | |
BatchValueHolder phonesBVH = (BatchValueHolder) phonesHolder; | |
assertFalse(phonesBVH.isInstantiated()); | |
assertSame(session, phonesBVH.getSession()); | |
querySession = phonesBVH.getQuery().getSession(); | |
if (querySession != null) { | |
assertSame(session, querySession); | |
assertFalse(querySession.isUnitOfWork()); | |
} else { | |
System.out.println("Employee(" + sharedEmp.getId() + ") has null session in phoneNumbers.BVH.query"); | |
} | |
phonesBVH.getValue(); | |
assertTrue(phonesBVH.isInstantiated()); | |
assertNull(phonesBVH.getSession()); | |
assertNull(phonesBVH.getQuery()); | |
} | |
} | |
@SuppressWarnings("unchecked") | |
private <T> T getMapping(String entityAlias, String attribute, Class<T> class1) { | |
return (T) JpaHelper.getServerSession(getEMF()).getDescriptorForAlias(entityAlias).getMappingForAttributeName(attribute); | |
} | |
private void assertLazy(String entityAlias, String attribute) { | |
Assert.assertTrue(getMapping(entityAlias, attribute, DatabaseMapping.class).isLazy()); | |
} | |
private void assertWoven(String entityAlias) { | |
Assert.assertTrue(PersistenceWeaved.class.isAssignableFrom(JpaHelper.getServerSession(getEMF()).getDescriptorForAlias(entityAlias).getJavaClass())); | |
} | |
} |