/* * 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.superclass.auditparents; import java.util.Set; import javax.persistence.EntityManager; import org.hibernate.envers.Audited; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.tools.TestTools; import org.hibernate.mapping.Column; import org.hibernate.mapping.Table; import org.junit.Assert; import org.junit.Test; /** * Tests mapping of child entity which parent declares one of its ancestors as audited with {@link Audited#auditParents()} * property. Child entity may mark explicitly its parent as audited or not. * * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ public class TransitiveAuditParentsTest extends BaseEnversJPAFunctionalTestCase { private long childImpTransId = 1L; private long childExpTransId = 2L; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { MappedGrandparentEntity.class, TransitiveParentEntity.class, ImplicitTransitiveChildEntity.class, ExplicitTransitiveChildEntity.class }; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // Revision 1 em.getTransaction().begin(); em.persist( new ImplicitTransitiveChildEntity( childImpTransId, "grandparent 1", "notAudited 1", "parent 1", "child 1" ) ); em.getTransaction().commit(); // Revision 2 em.getTransaction().begin(); em.persist( new ExplicitTransitiveChildEntity( childExpTransId, "grandparent 2", "notAudited 2", "parent 2", "child 2" ) ); em.getTransaction().commit(); } @Test public void testCreatedAuditTables() { Table explicitTransChildTable = metadata().getEntityBinding( "org.hibernate.envers.test.integration.superclass.auditparents.ExplicitTransitiveChildEntity_AUD" ).getTable(); checkTableColumns( TestTools.makeSet( "child", "parent", "grandparent", "id" ), TestTools.makeSet( "notAudited" ), explicitTransChildTable ); Table implicitTransChildTable = metadata().getEntityBinding( "org.hibernate.envers.test.integration.superclass.auditparents.ImplicitTransitiveChildEntity_AUD" ).getTable(); checkTableColumns( TestTools.makeSet( "child", "parent", "grandparent", "id" ), TestTools.makeSet( "notAudited" ), implicitTransChildTable ); } private void checkTableColumns(Set<String> expectedColumns, Set<String> unexpectedColumns, Table table) { for ( String columnName : expectedColumns ) { // Check whether expected column exists. Assert.assertNotNull( table.getColumn( new Column( columnName ) ) ); } for ( String columnName : unexpectedColumns ) { // Check whether unexpected column does not exist. Assert.assertNull( table.getColumn( new Column( columnName ) ) ); } } @Test public void testImplicitTransitiveAuditParents() { // expectedChild.notAudited shall be null, because it is not audited. ImplicitTransitiveChildEntity expectedChild = new ImplicitTransitiveChildEntity( childImpTransId, "grandparent 1", null, "parent 1", "child 1" ); ImplicitTransitiveChildEntity child = getAuditReader().find( ImplicitTransitiveChildEntity.class, childImpTransId, 1 ); Assert.assertEquals( expectedChild, child ); } @Test public void testExplicitTransitiveAuditParents() { // expectedChild.notAudited shall be null, because it is not audited. ExplicitTransitiveChildEntity expectedChild = new ExplicitTransitiveChildEntity( childExpTransId, "grandparent 2", null, "parent 2", "child 2" ); ExplicitTransitiveChildEntity child = getAuditReader().find( ExplicitTransitiveChildEntity.class, childExpTransId, 2 ); Assert.assertEquals( expectedChild, child ); } }