/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ 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.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.mapping.Formula; import org.hibernate.mapping.PersistentClass; import org.junit.Assert; import org.junit.Test; /** * @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 protected Class<?>[] getAnnotatedClasses() { return new Class[] {ClassTypeEntity.class, ParentEntity.class, ChildEntity.class}; } @Test @Priority(10) public void initData() { parentAudit = metadata().getEntityBinding( "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 ); } }