package org.hibernate.envers.test.integration.inheritance.single.discriminatorformula; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.persistence.EntityManager; import org.junit.Assert; import org.junit.Test; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.mapping.Formula; import org.hibernate.mapping.PersistentClass; /** * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ public class DiscriminatorFormulaTest extends BaseEnversJPAFunctionalTestCase { private PersistentClass parentAudit = null; private ChildEntity childVer1 = null; private ChildEntity childVer2 = null; private ParentEntity parentVer1 = null; private ParentEntity parentVer2 = null; @Override public void configure(Ejb3Configuration cfg) { cfg.addAnnotatedClass(ClassTypeEntity.class); cfg.addAnnotatedClass(ParentEntity.class); cfg.addAnnotatedClass(ChildEntity.class); } @Test @Priority(10) public void initData() { parentAudit = getCfg().getClassMapping("org.hibernate.envers.test.integration.inheritance.single.discriminatorformula.ParentEntity_AUD"); EntityManager em = getEntityManager(); // Child entity type em.getTransaction().begin(); ClassTypeEntity childType = new ClassTypeEntity(); childType.setType(ClassTypeEntity.CHILD_TYPE); em.persist(childType); Long childTypeId = childType.getId(); em.getTransaction().commit(); // Parent entity type em.getTransaction().begin(); ClassTypeEntity parentType = new ClassTypeEntity(); parentType.setType(ClassTypeEntity.PARENT_TYPE); em.persist(parentType); Long parentTypeId = parentType.getId(); em.getTransaction().commit(); // Child Rev 1 em.getTransaction().begin(); ChildEntity child = new ChildEntity(childTypeId, "Child data", "Child specific data"); em.persist(child); Long childId = child.getId(); em.getTransaction().commit(); // Parent Rev 2 em.getTransaction().begin(); ParentEntity parent = new ParentEntity(parentTypeId, "Parent data"); em.persist(parent); Long parentId = parent.getId(); em.getTransaction().commit(); // Child Rev 3 em.getTransaction().begin(); child = em.find(ChildEntity.class, childId); child.setData("Child data modified"); em.getTransaction().commit(); // Parent Rev 4 em.getTransaction().begin(); parent = em.find(ParentEntity.class, parentId); parent.setData("Parent data modified"); em.getTransaction().commit(); childVer1 = new ChildEntity(childId, childTypeId, "Child data", "Child specific data"); childVer2 = new ChildEntity(childId, childTypeId, "Child data modified", "Child specific data"); parentVer1 = new ParentEntity(parentId, parentTypeId, "Parent data"); parentVer2 = new ParentEntity(parentId, parentTypeId, "Parent data modified"); } @Test public void testDiscriminatorFormulaInAuditTable() { assert parentAudit.getDiscriminator().hasFormula(); Iterator iterator = parentAudit.getDiscriminator().getColumnIterator(); while (iterator.hasNext()) { Object o = iterator.next(); if (o instanceof Formula) { Formula formula = (Formula) o; Assert.assertEquals(ParentEntity.DISCRIMINATOR_QUERY, formula.getText()); return; } } assert false; } @Test public void testRevisionsCounts() { Assert.assertEquals(Arrays.asList(1, 3), getAuditReader().getRevisions(ChildEntity.class, childVer1.getId())); Assert.assertEquals(Arrays.asList(2, 4), getAuditReader().getRevisions(ParentEntity.class, parentVer1.getId())); } @Test public void testHistoryOfParent() { Assert.assertEquals(parentVer1, getAuditReader().find(ParentEntity.class, parentVer1.getId(), 2)); Assert.assertEquals(parentVer2, getAuditReader().find(ParentEntity.class, parentVer2.getId(), 4)); } @Test public void testHistoryOfChild() { Assert.assertEquals(childVer1, getAuditReader().find(ChildEntity.class, childVer1.getId(), 1)); Assert.assertEquals(childVer2, getAuditReader().find(ChildEntity.class, childVer2.getId(), 3)); } @Test public void testPolymorphicQuery() { Assert.assertEquals(childVer1, getAuditReader().createQuery().forEntitiesAtRevision(ChildEntity.class, 1).getSingleResult()); Assert.assertEquals(childVer1, getAuditReader().createQuery().forEntitiesAtRevision(ParentEntity.class, 1).getSingleResult()); List childEntityRevisions = getAuditReader().createQuery().forRevisionsOfEntity(ChildEntity.class, true, false).getResultList(); Assert.assertEquals(Arrays.asList(childVer1, childVer2), childEntityRevisions); List parentEntityRevisions = getAuditReader().createQuery().forRevisionsOfEntity(ParentEntity.class, true, false).getResultList(); Assert.assertEquals(Arrays.asList(childVer1, parentVer1, childVer2, parentVer2), parentEntityRevisions); } }