package org.hibernate.envers.test.integration.inheritance.single.discriminatorformula; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.Priority; import org.hibernate.mapping.Formula; import org.hibernate.mapping.PersistentClass; import org.junit.Test; import javax.persistence.EntityManager; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ public class DiscriminatorFormulaTest extends AbstractEntityTest { 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 formula.getText().equals(ParentEntity.DISCRIMINATOR_QUERY); return; } } assert false; } @Test public void testRevisionsCounts() { assert Arrays.asList(1, 3).equals(getAuditReader().getRevisions(ChildEntity.class, childVer1.getId())); assert Arrays.asList(2, 4).equals(getAuditReader().getRevisions(ParentEntity.class, parentVer1.getId())); } @Test public void testHistoryOfParent() { assert getAuditReader().find(ParentEntity.class, parentVer1.getId(), 2).equals(parentVer1); assert getAuditReader().find(ParentEntity.class, parentVer2.getId(), 4).equals(parentVer2); } @Test public void testHistoryOfChild() { assert getAuditReader().find(ChildEntity.class, childVer1.getId(), 1).equals(childVer1); assert getAuditReader().find(ChildEntity.class, childVer2.getId(), 3).equals(childVer2); } @Test public void testPolymorphicQuery() { assert getAuditReader().createQuery().forEntitiesAtRevision(ChildEntity.class, 1).getSingleResult().equals(childVer1); assert getAuditReader().createQuery().forEntitiesAtRevision(ParentEntity.class, 1).getSingleResult().equals(childVer1); List childEntityRevisions = getAuditReader().createQuery().forRevisionsOfEntity(ChildEntity.class, true, false).getResultList(); assert Arrays.asList(childVer1, childVer2).equals(childEntityRevisions); List parentEntityRevisions = getAuditReader().createQuery().forRevisionsOfEntity(ParentEntity.class, true, false).getResultList(); assert Arrays.asList(childVer1, parentVer1, childVer2, parentVer2).equals(parentEntityRevisions); } }