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.junit.Assert; import org.junit.Test; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.tools.TestTools; import org.hibernate.testing.TestForIssue; /** * @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; public void configure(Ejb3Configuration cfg) { cfg.addAnnotatedClass(OneToManyOwned.class); cfg.addAnnotatedClass(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()); } }