/* * 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.collection.embeddable; import java.util.Arrays; import javax.persistence.EntityManager; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.StrTestNoProxyEntity; import org.hibernate.envers.test.entities.collection.EmbeddableListEntity2; import org.hibernate.envers.test.entities.components.relations.ManyToOneEagerComponent; import org.hibernate.testing.TestForIssue; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * Checks if many-to-one relations inside an embedded component list are being audited. * * @author thiagolrc */ @TestForIssue(jiraKey = "HHH-6613") public class EmbeddableList2 extends BaseEnversJPAFunctionalTestCase { private Integer ele_id1 = null; private StrTestNoProxyEntity entity1 = new StrTestNoProxyEntity( "strTestEntity1" ); private StrTestNoProxyEntity entity2 = new StrTestNoProxyEntity( "strTestEntity2" ); private StrTestNoProxyEntity entity3 = new StrTestNoProxyEntity( "strTestEntity3" ); private StrTestNoProxyEntity entity4 = new StrTestNoProxyEntity( "strTestEntity3" ); private StrTestNoProxyEntity entity4Copy = null; private ManyToOneEagerComponent manyToOneComponent1 = new ManyToOneEagerComponent( entity1, "dataComponent1" ); private ManyToOneEagerComponent manyToOneComponent2 = new ManyToOneEagerComponent( entity2, "dataComponent2" ); private ManyToOneEagerComponent manyToOneComponent4 = new ManyToOneEagerComponent( entity4, "dataComponent4" ); @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] {EmbeddableListEntity2.class, StrTestNoProxyEntity.class}; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // Revision 1 (ele1: saving a list with 1 many-to-one component) em.getTransaction().begin(); EmbeddableListEntity2 ele1 = new EmbeddableListEntity2(); em.persist( entity1 ); //persisting the entities referenced by the components em.persist( entity2 ); ele1.getComponentList().add( manyToOneComponent1 ); em.persist( ele1 ); em.getTransaction().commit(); ele_id1 = ele1.getId(); // Revision 2 (ele1: changing the component) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); ele1.getComponentList().clear(); ele1.getComponentList().add( manyToOneComponent2 ); em.getTransaction().commit(); //Revision 3 (ele1: putting back the many-to-one component to the list) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); ele1.getComponentList().add( manyToOneComponent1 ); em.getTransaction().commit(); // Revision 4 (ele1: changing the component's entity) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); em.persist( entity3 ); ele1.getComponentList().get( ele1.getComponentList().indexOf( manyToOneComponent2 ) ).setEntity( entity3 ); ele1.getComponentList() .get( ele1.getComponentList().indexOf( manyToOneComponent2 ) ) .setData( "dataComponent3" ); em.getTransaction().commit(); // Revision 5 (ele1: adding a new many-to-one component) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); em.persist( entity4 ); entity4Copy = new StrTestNoProxyEntity( entity4.getStr(), entity4.getId() ); ele1.getComponentList().add( manyToOneComponent4 ); em.getTransaction().commit(); // Revision 6 (ele1: changing the component's entity properties) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); ele1.getComponentList() .get( ele1.getComponentList().indexOf( manyToOneComponent4 ) ) .getEntity() .setStr( "sat4" ); em.getTransaction().commit(); // Revision 7 (ele1: removing component) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); ele1.getComponentList().remove( ele1.getComponentList().indexOf( manyToOneComponent4 ) ); em.getTransaction().commit(); // Revision 8 (ele1: removing all) em.getTransaction().begin(); ele1 = em.find( EmbeddableListEntity2.class, ele1.getId() ); em.remove( ele1 ); em.getTransaction().commit(); em.close(); } @Test public void testRevisionsCounts() { assertEquals( Arrays.asList( 1, 2, 3, 4, 5, 7, 8 ), getAuditReader().getRevisions( EmbeddableListEntity2.class, ele_id1 ) ); assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( StrTestNoProxyEntity.class, entity1.getId() ) ); assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( StrTestNoProxyEntity.class, entity2.getId() ) ); assertEquals( Arrays.asList( 4 ), getAuditReader().getRevisions( StrTestNoProxyEntity.class, entity3.getId() ) ); assertEquals( Arrays.asList( 5, 6 ), getAuditReader().getRevisions( StrTestNoProxyEntity.class, entity4.getId() ) ); } @Test public void testManyToOneComponentList() { // Revision 1: many-to-one component1 in the list EmbeddableListEntity2 rev1 = getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 1 ); assertNotNull( "Revision not found", rev1 ); assertTrue( "The component collection was not audited", rev1.getComponentList().size() > 0 ); assertEquals( "The component primitive property was not audited", "dataComponent1", rev1.getComponentList().get( 0 ).getData() ); assertEquals( "The component manyToOne reference was not audited", entity1, rev1.getComponentList().get( 0 ).getEntity() ); } @Test public void testHistoryOfEle1() { // Revision 1: many-to-one component in the list assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity1, "dataComponent1" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 1 ).getComponentList() ); // Revision 2: many-to-one component in the list assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity2, "dataComponent2" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 2 ).getComponentList() ); // Revision 3: two many-to-one components in the list assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity2, "dataComponent2" ), new ManyToOneEagerComponent( entity1, "dataComponent1" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 3 ).getComponentList() ); // Revision 4: second component edited and first one in the list assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity3, "dataComponent3" ), new ManyToOneEagerComponent( entity1, "dataComponent1" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 4 ).getComponentList() ); // Revision 5: fourth component added in the list assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity3, "dataComponent3" ), new ManyToOneEagerComponent( entity1, "dataComponent1" ), new ManyToOneEagerComponent( entity4Copy, "dataComponent4" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 5 ).getComponentList() ); // Revision 6: changing fourth component property assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity3, "dataComponent3" ), new ManyToOneEagerComponent( entity1, "dataComponent1" ), new ManyToOneEagerComponent( entity4, "dataComponent4" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 6 ).getComponentList() ); // Revision 7: removing component number four assertEquals( Arrays.asList( new ManyToOneEagerComponent( entity3, "dataComponent3" ), new ManyToOneEagerComponent( entity1, "dataComponent1" ) ), getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 7 ).getComponentList() ); assertNull( getAuditReader().find( EmbeddableListEntity2.class, ele_id1, 8 ) ); } }