/* * 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.mixed; import java.util.Arrays; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.integration.inheritance.mixed.entities.AbstractActivity; import org.hibernate.envers.test.integration.inheritance.mixed.entities.AbstractCheckActivity; import org.hibernate.envers.test.integration.inheritance.mixed.entities.Activity; import org.hibernate.envers.test.integration.inheritance.mixed.entities.ActivityId; import org.hibernate.envers.test.integration.inheritance.mixed.entities.CheckInActivity; import org.hibernate.envers.test.integration.inheritance.mixed.entities.NormalActivity; import org.junit.Test; import static org.junit.Assert.assertEquals; /** * @author Michal Skowronek (mskowr at o2 pl) */ public class MixedInheritanceStrategiesEntityTest extends BaseEnversJPAFunctionalTestCase { private ActivityId id2; private ActivityId id1; private ActivityId id3; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { AbstractActivity.class, AbstractCheckActivity.class, CheckInActivity.class, NormalActivity.class }; } @Test @Priority(10) public void initData() { NormalActivity normalActivity = new NormalActivity(); id1 = new ActivityId( 1, 2 ); normalActivity.setId( id1 ); normalActivity.setSequenceNumber( 1 ); // Revision 1 getEntityManager().getTransaction().begin(); getEntityManager().persist( normalActivity ); getEntityManager().getTransaction().commit(); // Revision 2 getEntityManager().getTransaction().begin(); normalActivity = getEntityManager().find( NormalActivity.class, id1 ); CheckInActivity checkInActivity = new CheckInActivity(); id2 = new ActivityId( 2, 3 ); checkInActivity.setId( id2 ); checkInActivity.setSequenceNumber( 0 ); checkInActivity.setDurationInMinutes( 30 ); checkInActivity.setRelatedActivity( normalActivity ); getEntityManager().persist( checkInActivity ); getEntityManager().getTransaction().commit(); // Revision 3 normalActivity = new NormalActivity(); id3 = new ActivityId( 3, 4 ); normalActivity.setId( id3 ); normalActivity.setSequenceNumber( 2 ); getEntityManager().getTransaction().begin(); getEntityManager().persist( normalActivity ); getEntityManager().getTransaction().commit(); // Revision 4 getEntityManager().getTransaction().begin(); normalActivity = getEntityManager().find( NormalActivity.class, id3 ); checkInActivity = getEntityManager().find( CheckInActivity.class, id2 ); checkInActivity.setRelatedActivity( normalActivity ); getEntityManager().merge( checkInActivity ); getEntityManager().getTransaction().commit(); } @Test public void testRevisionsCounts() { assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( NormalActivity.class, id1 ) ); assertEquals( Arrays.asList( 3 ), getAuditReader().getRevisions( NormalActivity.class, id3 ) ); assertEquals( Arrays.asList( 2, 4 ), getAuditReader().getRevisions( CheckInActivity.class, id2 ) ); } @Test public void testCurrentStateOfCheckInActivity() { final CheckInActivity checkInActivity = getEntityManager().find( CheckInActivity.class, id2 ); final NormalActivity normalActivity = getEntityManager().find( NormalActivity.class, id3 ); assertEquals( id2, checkInActivity.getId() ); assertEquals( 0, checkInActivity.getSequenceNumber().intValue() ); assertEquals( 30, checkInActivity.getDurationInMinutes().intValue() ); final Activity relatedActivity = checkInActivity.getRelatedActivity(); assertEquals( normalActivity.getId(), relatedActivity.getId() ); assertEquals( normalActivity.getSequenceNumber(), relatedActivity.getSequenceNumber() ); } @Test public void testCheckCurrentStateOfNormalActivities() throws Exception { final NormalActivity normalActivity1 = getEntityManager().find( NormalActivity.class, id1 ); final NormalActivity normalActivity2 = getEntityManager().find( NormalActivity.class, id3 ); assertEquals( id1, normalActivity1.getId() ); assertEquals( 1, normalActivity1.getSequenceNumber().intValue() ); assertEquals( id3, normalActivity2.getId() ); assertEquals( 2, normalActivity2.getSequenceNumber().intValue() ); } @Test public void doTestFirstRevisionOfCheckInActivity() throws Exception { CheckInActivity checkInActivity = getAuditReader().find( CheckInActivity.class, id2, 2 ); NormalActivity normalActivity = getAuditReader().find( NormalActivity.class, id1, 2 ); assertEquals( id2, checkInActivity.getId() ); assertEquals( 0, checkInActivity.getSequenceNumber().intValue() ); assertEquals( 30, checkInActivity.getDurationInMinutes().intValue() ); Activity relatedActivity = checkInActivity.getRelatedActivity(); assertEquals( normalActivity.getId(), relatedActivity.getId() ); assertEquals( normalActivity.getSequenceNumber(), relatedActivity.getSequenceNumber() ); } @Test public void doTestSecondRevisionOfCheckInActivity() throws Exception { CheckInActivity checkInActivity = getAuditReader().find( CheckInActivity.class, id2, 4 ); NormalActivity normalActivity = getAuditReader().find( NormalActivity.class, id3, 4 ); assertEquals( id2, checkInActivity.getId() ); assertEquals( 0, checkInActivity.getSequenceNumber().intValue() ); assertEquals( 30, checkInActivity.getDurationInMinutes().intValue() ); Activity relatedActivity = checkInActivity.getRelatedActivity(); assertEquals( normalActivity.getId(), relatedActivity.getId() ); assertEquals( normalActivity.getSequenceNumber(), relatedActivity.getSequenceNumber() ); } }