/* * 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.unidirectional; import java.util.Arrays; import java.util.HashSet; import javax.persistence.EntityManager; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.StrTestEntity; import org.hibernate.envers.test.entities.manytomany.unidirectional.JoinTableEntity; import org.hibernate.testing.TestForIssue; import org.junit.Assert; import org.junit.Test; /** * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ @TestForIssue(jiraKey = "HHH-8087") public class JoinTableDetachedTest extends BaseEnversJPAFunctionalTestCase { private Long collectionEntityId = null; private Integer element1Id = null; private Integer element2Id = null; @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] {JoinTableEntity.class, StrTestEntity.class}; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // Revision 1 - addition em.getTransaction().begin(); JoinTableEntity collectionEntity = new JoinTableEntity( "some data" ); StrTestEntity element1 = new StrTestEntity( "str1" ); StrTestEntity element2 = new StrTestEntity( "str2" ); collectionEntity.getReferences().add( element1 ); collectionEntity.getReferences().add( element2 ); em.persist( element1 ); em.persist( element2 ); em.persist( collectionEntity ); em.getTransaction().commit(); collectionEntityId = collectionEntity.getId(); element1Id = element1.getId(); element2Id = element2.getId(); em.close(); em = getEntityManager(); // Revision 2 - simple modification em.getTransaction().begin(); collectionEntity = em.find( JoinTableEntity.class, collectionEntity.getId() ); collectionEntity.setData( "some other data" ); collectionEntity = em.merge( collectionEntity ); em.getTransaction().commit(); em.close(); em = getEntityManager(); // Revision 3 - remove detached object from collection em.getTransaction().begin(); collectionEntity = em.find( JoinTableEntity.class, collectionEntity.getId() ); collectionEntity.getReferences().remove( element1 ); collectionEntity = em.merge( collectionEntity ); em.getTransaction().commit(); em.close(); em = getEntityManager(); // Revision 4 - replace the collection em.getTransaction().begin(); collectionEntity = em.find( JoinTableEntity.class, collectionEntity.getId() ); collectionEntity.setReferences( new HashSet<StrTestEntity>() ); collectionEntity = em.merge( collectionEntity ); em.getTransaction().commit(); em.close(); em = getEntityManager(); // Revision 5 - add to collection em.getTransaction().begin(); collectionEntity = em.find( JoinTableEntity.class, collectionEntity.getId() ); collectionEntity.getReferences().add( element1 ); collectionEntity = em.merge( collectionEntity ); em.getTransaction().commit(); em.close(); } @Test public void testRevisionsCounts() { Assert.assertEquals( Arrays.asList( 1, 2, 3, 4, 5 ), getAuditReader().getRevisions( JoinTableEntity.class, collectionEntityId ) ); Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( StrTestEntity.class, element1Id ) ); Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( StrTestEntity.class, element2Id ) ); } @Test public void testHistoryOfCollectionEntity() { // Revision 1 JoinTableEntity collectionEntity = new JoinTableEntity( collectionEntityId, "some data" ); StrTestEntity element1 = new StrTestEntity( "str1", element1Id ); StrTestEntity element2 = new StrTestEntity( "str2", element2Id ); collectionEntity.getReferences().add( element1 ); collectionEntity.getReferences().add( element2 ); JoinTableEntity ver1 = getAuditReader().find( JoinTableEntity.class, collectionEntityId, 1 ); Assert.assertEquals( collectionEntity, ver1 ); Assert.assertEquals( collectionEntity.getReferences(), ver1.getReferences() ); // Revision 2 collectionEntity.setData( "some other data" ); JoinTableEntity ver2 = getAuditReader().find( JoinTableEntity.class, collectionEntityId, 2 ); Assert.assertEquals( collectionEntity, ver2 ); Assert.assertEquals( collectionEntity.getReferences(), ver2.getReferences() ); // Revision 3 collectionEntity.getReferences().remove( element1 ); JoinTableEntity ver3 = getAuditReader().find( JoinTableEntity.class, collectionEntityId, 3 ); Assert.assertEquals( collectionEntity, ver3 ); Assert.assertEquals( collectionEntity.getReferences(), ver3.getReferences() ); // Revision 4 collectionEntity.setReferences( new HashSet<StrTestEntity>() ); JoinTableEntity ver4 = getAuditReader().find( JoinTableEntity.class, collectionEntityId, 4 ); Assert.assertEquals( collectionEntity, ver4 ); Assert.assertEquals( collectionEntity.getReferences(), ver4.getReferences() ); // Revision 5 collectionEntity.getReferences().add( element1 ); JoinTableEntity ver5 = getAuditReader().find( JoinTableEntity.class, collectionEntityId, 5 ); Assert.assertEquals( collectionEntity, ver5 ); Assert.assertEquals( collectionEntity.getReferences(), ver5.getReferences() ); } }