/* * 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.manytomany.sametable; import java.sql.Types; import java.util.Arrays; import javax.persistence.EntityManager; import org.hibernate.Session; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.manytomany.sametable.Child1Entity; import org.hibernate.envers.test.entities.manytomany.sametable.Child2Entity; import org.hibernate.envers.test.entities.manytomany.sametable.ParentEntity; import org.hibernate.envers.test.tools.TestTools; import org.junit.Assert; import org.junit.Test; /** * Test which checks that auditing entities which contain multiple mappings to same tables work. * * @author Adam Warski (adam at warski dot org) */ public class BasicSametable extends BaseEnversJPAFunctionalTestCase { private Integer p1_id; private Integer p2_id; private Integer c1_1_id; private Integer c1_2_id; private Integer c2_1_id; private Integer c2_2_id; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {ParentEntity.class, Child1Entity.class, Child2Entity.class}; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // We need first to modify the columns in the middle (join table) to allow null values. Hbm2ddl doesn't seem // to allow this. em.getTransaction().begin(); Session session = (Session) em.getDelegate(); session.createSQLQuery( "DROP TABLE children" ).executeUpdate(); session.createSQLQuery( "CREATE TABLE children ( parent_id " + getDialect().getTypeName( Types.INTEGER ) + ", child1_id " + getDialect().getTypeName( Types.INTEGER ) + getDialect().getNullColumnString() + ", child2_id " + getDialect().getTypeName( Types.INTEGER ) + getDialect().getNullColumnString() + " )" ).executeUpdate(); session.createSQLQuery( "DROP TABLE children_AUD" ).executeUpdate(); session.createSQLQuery( "CREATE TABLE children_AUD ( REV " + getDialect().getTypeName( Types.INTEGER ) + " NOT NULL" + ", REVEND " + getDialect().getTypeName( Types.INTEGER ) + ", REVTYPE " + getDialect().getTypeName( Types.TINYINT ) + ", parent_id " + getDialect().getTypeName( Types.INTEGER ) + ", child1_id " + getDialect().getTypeName( Types.INTEGER ) + getDialect().getNullColumnString() + ", child2_id " + getDialect().getTypeName( Types.INTEGER ) + getDialect().getNullColumnString() + " )" ).executeUpdate(); em.getTransaction().commit(); em.clear(); ParentEntity p1 = new ParentEntity( "parent_1" ); ParentEntity p2 = new ParentEntity( "parent_2" ); Child1Entity c1_1 = new Child1Entity( "child1_1" ); Child1Entity c1_2 = new Child1Entity( "child1_2" ); Child2Entity c2_1 = new Child2Entity( "child2_1" ); Child2Entity c2_2 = new Child2Entity( "child2_2" ); // Revision 1 em.getTransaction().begin(); em.persist( p1 ); em.persist( p2 ); em.persist( c1_1 ); em.persist( c1_2 ); em.persist( c2_1 ); em.persist( c2_2 ); em.getTransaction().commit(); em.clear(); // Revision 2 - (p1: c1_1, p2: c2_1) em.getTransaction().begin(); p1 = em.find( ParentEntity.class, p1.getId() ); p2 = em.find( ParentEntity.class, p2.getId() ); c1_1 = em.find( Child1Entity.class, c1_1.getId() ); c2_1 = em.find( Child2Entity.class, c2_1.getId() ); p1.getChildren1().add( c1_1 ); p2.getChildren2().add( c2_1 ); em.getTransaction().commit(); em.clear(); // Revision 3 - (p1: c1_1, c1_2, c2_2, p2: c1_1, c2_1) em.getTransaction().begin(); p1 = em.find( ParentEntity.class, p1.getId() ); p2 = em.find( ParentEntity.class, p2.getId() ); c1_1 = em.find( Child1Entity.class, c1_1.getId() ); c1_2 = em.find( Child1Entity.class, c1_2.getId() ); c2_2 = em.find( Child2Entity.class, c2_2.getId() ); p1.getChildren1().add( c1_2 ); p1.getChildren2().add( c2_2 ); p2.getChildren1().add( c1_1 ); em.getTransaction().commit(); em.clear(); // Revision 4 - (p1: c1_2, c2_2, p2: c1_1, c2_1, c2_2) em.getTransaction().begin(); p1 = em.find( ParentEntity.class, p1.getId() ); p2 = em.find( ParentEntity.class, p2.getId() ); c1_1 = em.find( Child1Entity.class, c1_1.getId() ); c2_2 = em.find( Child2Entity.class, c2_2.getId() ); p1.getChildren1().remove( c1_1 ); p2.getChildren2().add( c2_2 ); em.getTransaction().commit(); em.clear(); // Revision 5 - (p1: c2_2, p2: c1_1, c2_1) em.getTransaction().begin(); p1 = em.find( ParentEntity.class, p1.getId() ); p2 = em.find( ParentEntity.class, p2.getId() ); c1_2 = em.find( Child1Entity.class, c1_2.getId() ); c2_2 = em.find( Child2Entity.class, c2_2.getId() ); c2_2.getParents().remove( p2 ); c1_2.getParents().remove( p1 ); em.getTransaction().commit(); em.clear(); // p1_id = p1.getId(); p2_id = p2.getId(); c1_1_id = c1_1.getId(); c1_2_id = c1_2.getId(); c2_1_id = c2_1.getId(); c2_2_id = c2_2.getId(); } @Test public void testRevisionsCounts() { assert Arrays.asList( 1, 2, 3, 4 ).equals( getAuditReader().getRevisions( ParentEntity.class, p1_id ) ); assert Arrays.asList( 1, 2, 3, 4 ).equals( getAuditReader().getRevisions( ParentEntity.class, p2_id ) ); assert Arrays.asList( 1 ).equals( getAuditReader().getRevisions( Child1Entity.class, c1_1_id ) ); assert Arrays.asList( 1, 5 ).equals( getAuditReader().getRevisions( Child1Entity.class, c1_2_id ) ); Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Child2Entity.class, c2_1_id ) ); Assert.assertEquals( Arrays.asList( 1, 5 ), getAuditReader().getRevisions( Child2Entity.class, c2_2_id ) ); } @Test public void testHistoryOfParent1() { Child1Entity c1_1 = getEntityManager().find( Child1Entity.class, c1_1_id ); Child1Entity c1_2 = getEntityManager().find( Child1Entity.class, c1_2_id ); Child2Entity c2_2 = getEntityManager().find( Child2Entity.class, c2_2_id ); ParentEntity rev1 = getAuditReader().find( ParentEntity.class, p1_id, 1 ); ParentEntity rev2 = getAuditReader().find( ParentEntity.class, p1_id, 2 ); ParentEntity rev3 = getAuditReader().find( ParentEntity.class, p1_id, 3 ); ParentEntity rev4 = getAuditReader().find( ParentEntity.class, p1_id, 4 ); ParentEntity rev5 = getAuditReader().find( ParentEntity.class, p1_id, 5 ); assert TestTools.checkCollection( rev1.getChildren1() ); assert TestTools.checkCollection( rev2.getChildren1(), c1_1 ); assert TestTools.checkCollection( rev3.getChildren1(), c1_1, c1_2 ); assert TestTools.checkCollection( rev4.getChildren1(), c1_2 ); assert TestTools.checkCollection( rev5.getChildren1() ); assert TestTools.checkCollection( rev1.getChildren2() ); assert TestTools.checkCollection( rev2.getChildren2() ); assert TestTools.checkCollection( rev3.getChildren2(), c2_2 ); assert TestTools.checkCollection( rev4.getChildren2(), c2_2 ); assert TestTools.checkCollection( rev5.getChildren2(), c2_2 ); } @Test public void testHistoryOfParent2() { Child1Entity c1_1 = getEntityManager().find( Child1Entity.class, c1_1_id ); Child2Entity c2_1 = getEntityManager().find( Child2Entity.class, c2_1_id ); Child2Entity c2_2 = getEntityManager().find( Child2Entity.class, c2_2_id ); ParentEntity rev1 = getAuditReader().find( ParentEntity.class, p2_id, 1 ); ParentEntity rev2 = getAuditReader().find( ParentEntity.class, p2_id, 2 ); ParentEntity rev3 = getAuditReader().find( ParentEntity.class, p2_id, 3 ); ParentEntity rev4 = getAuditReader().find( ParentEntity.class, p2_id, 4 ); ParentEntity rev5 = getAuditReader().find( ParentEntity.class, p2_id, 5 ); assert TestTools.checkCollection( rev1.getChildren1() ); assert TestTools.checkCollection( rev2.getChildren1() ); assert TestTools.checkCollection( rev3.getChildren1(), c1_1 ); assert TestTools.checkCollection( rev4.getChildren1(), c1_1 ); assert TestTools.checkCollection( rev5.getChildren1(), c1_1 ); assert TestTools.checkCollection( rev1.getChildren2() ); assert TestTools.checkCollection( rev2.getChildren2(), c2_1 ); assert TestTools.checkCollection( rev3.getChildren2(), c2_1 ); assert TestTools.checkCollection( rev4.getChildren2(), c2_1, c2_2 ); assert TestTools.checkCollection( rev5.getChildren2(), c2_1 ); } @Test public void testHistoryOfChild1_1() { ParentEntity p1 = getEntityManager().find( ParentEntity.class, p1_id ); ParentEntity p2 = getEntityManager().find( ParentEntity.class, p2_id ); Child1Entity rev1 = getAuditReader().find( Child1Entity.class, c1_1_id, 1 ); Child1Entity rev2 = getAuditReader().find( Child1Entity.class, c1_1_id, 2 ); Child1Entity rev3 = getAuditReader().find( Child1Entity.class, c1_1_id, 3 ); Child1Entity rev4 = getAuditReader().find( Child1Entity.class, c1_1_id, 4 ); Child1Entity rev5 = getAuditReader().find( Child1Entity.class, c1_1_id, 5 ); assert TestTools.checkCollection( rev1.getParents() ); assert TestTools.checkCollection( rev2.getParents(), p1 ); assert TestTools.checkCollection( rev3.getParents(), p1, p2 ); assert TestTools.checkCollection( rev4.getParents(), p2 ); assert TestTools.checkCollection( rev5.getParents(), p2 ); } // TODO: was disabled? @Test public void testHistoryOfChild1_2() { ParentEntity p1 = getEntityManager().find( ParentEntity.class, p1_id ); Child1Entity rev1 = getAuditReader().find( Child1Entity.class, c1_2_id, 1 ); Child1Entity rev2 = getAuditReader().find( Child1Entity.class, c1_2_id, 2 ); Child1Entity rev3 = getAuditReader().find( Child1Entity.class, c1_2_id, 3 ); Child1Entity rev4 = getAuditReader().find( Child1Entity.class, c1_2_id, 4 ); Child1Entity rev5 = getAuditReader().find( Child1Entity.class, c1_2_id, 5 ); assert TestTools.checkCollection( rev1.getParents() ); assert TestTools.checkCollection( rev2.getParents() ); assert TestTools.checkCollection( rev3.getParents(), p1 ); assert TestTools.checkCollection( rev4.getParents(), p1 ); assert TestTools.checkCollection( rev5.getParents() ); } @Test public void testHistoryOfChild2_1() { ParentEntity p2 = getEntityManager().find( ParentEntity.class, p2_id ); Child2Entity rev1 = getAuditReader().find( Child2Entity.class, c2_1_id, 1 ); Child2Entity rev2 = getAuditReader().find( Child2Entity.class, c2_1_id, 2 ); Child2Entity rev3 = getAuditReader().find( Child2Entity.class, c2_1_id, 3 ); Child2Entity rev4 = getAuditReader().find( Child2Entity.class, c2_1_id, 4 ); Child2Entity rev5 = getAuditReader().find( Child2Entity.class, c2_1_id, 5 ); assert TestTools.checkCollection( rev1.getParents() ); assert TestTools.checkCollection( rev2.getParents(), p2 ); assert TestTools.checkCollection( rev3.getParents(), p2 ); assert TestTools.checkCollection( rev4.getParents(), p2 ); assert TestTools.checkCollection( rev5.getParents(), p2 ); } @Test public void testHistoryOfChild2_2() { ParentEntity p1 = getEntityManager().find( ParentEntity.class, p1_id ); ParentEntity p2 = getEntityManager().find( ParentEntity.class, p2_id ); Child2Entity rev1 = getAuditReader().find( Child2Entity.class, c2_2_id, 1 ); Child2Entity rev2 = getAuditReader().find( Child2Entity.class, c2_2_id, 2 ); Child2Entity rev3 = getAuditReader().find( Child2Entity.class, c2_2_id, 3 ); Child2Entity rev4 = getAuditReader().find( Child2Entity.class, c2_2_id, 4 ); Child2Entity rev5 = getAuditReader().find( Child2Entity.class, c2_2_id, 5 ); assert TestTools.checkCollection( rev1.getParents() ); assert TestTools.checkCollection( rev2.getParents() ); assert TestTools.checkCollection( rev3.getParents(), p1 ); assert TestTools.checkCollection( rev4.getParents(), p1, p2 ); assert TestTools.checkCollection( rev5.getParents(), p1 ); } }