/* * 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.manytoone.bidirectional; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import javax.persistence.EntityManager; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.tools.TestTools; 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-4962") public class ImplicitMappedByTest extends BaseEnversJPAFunctionalTestCase { private Long ownedId = null; private Long owning1Id = null; private Long owning2Id = null; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {OneToManyOwned.class, ManyToOneOwning.class}; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); OneToManyOwned owned = new OneToManyOwned( "data", null ); Set<ManyToOneOwning> referencing = new HashSet<ManyToOneOwning>(); ManyToOneOwning owning1 = new ManyToOneOwning( "data1", owned ); referencing.add( owning1 ); ManyToOneOwning owning2 = new ManyToOneOwning( "data2", owned ); referencing.add( owning2 ); owned.setReferencing( referencing ); // Revision 1 em.getTransaction().begin(); em.persist( owned ); em.persist( owning1 ); em.persist( owning2 ); em.getTransaction().commit(); ownedId = owned.getId(); owning1Id = owning1.getId(); owning2Id = owning2.getId(); // Revision 2 em.getTransaction().begin(); owning1 = em.find( ManyToOneOwning.class, owning1.getId() ); em.remove( owning1 ); em.getTransaction().commit(); // Revision 3 em.getTransaction().begin(); owning2 = em.find( ManyToOneOwning.class, owning2.getId() ); owning2.setData( "data2modified" ); em.merge( owning2 ); em.getTransaction().commit(); } @Test public void testRevisionsCounts() { Assert.assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( OneToManyOwned.class, ownedId ) ); Assert.assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( ManyToOneOwning.class, owning1Id ) ); Assert.assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( ManyToOneOwning.class, owning2Id ) ); } @Test public void testHistoryOfOwned() { OneToManyOwned owned = new OneToManyOwned( "data", null, ownedId ); ManyToOneOwning owning1 = new ManyToOneOwning( "data1", owned, owning1Id ); ManyToOneOwning owning2 = new ManyToOneOwning( "data2", owned, owning2Id ); OneToManyOwned ver1 = getAuditReader().find( OneToManyOwned.class, ownedId, 1 ); Assert.assertEquals( owned, ver1 ); Assert.assertEquals( TestTools.makeSet( owning1, owning2 ), ver1.getReferencing() ); OneToManyOwned ver2 = getAuditReader().find( OneToManyOwned.class, ownedId, 2 ); Assert.assertEquals( owned, ver2 ); Assert.assertEquals( TestTools.makeSet( owning2 ), ver2.getReferencing() ); } @Test public void testHistoryOfOwning1() { ManyToOneOwning ver1 = new ManyToOneOwning( "data1", null, owning1Id ); Assert.assertEquals( ver1, getAuditReader().find( ManyToOneOwning.class, owning1Id, 1 ) ); } @Test public void testHistoryOfOwning2() { OneToManyOwned owned = new OneToManyOwned( "data", null, ownedId ); ManyToOneOwning owning1 = new ManyToOneOwning( "data2", owned, owning2Id ); ManyToOneOwning owning3 = new ManyToOneOwning( "data2modified", owned, owning2Id ); ManyToOneOwning ver1 = getAuditReader().find( ManyToOneOwning.class, owning2Id, 1 ); ManyToOneOwning ver3 = getAuditReader().find( ManyToOneOwning.class, owning2Id, 3 ); Assert.assertEquals( owning1, ver1 ); Assert.assertEquals( owned.getId(), ver1.getReferences().getId() ); Assert.assertEquals( owning3, ver3 ); Assert.assertEquals( owned.getId(), ver3.getReferences().getId() ); } }