/* * 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.multiplerelations; 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.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-7073") public class MultipleAssociationsTest extends BaseEnversJPAFunctionalTestCase { private long lukaszId = 0; private long kingaId = 0; private long warsawId = 0; private long cracowId = 0; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {Person.class, Address.class}; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // Revision 1 em.getTransaction().begin(); Person lukasz = new Person( "Lukasz" ); Person kinga = new Person( "Kinga" ); Address warsaw = new Address( "Warsaw" ); warsaw.getTenants().add( lukasz ); warsaw.setLandlord( lukasz ); warsaw.getTenants().add( kinga ); lukasz.getAddresses().add( warsaw ); lukasz.getOwnedAddresses().add( warsaw ); kinga.getAddresses().add( warsaw ); em.persist( lukasz ); em.persist( kinga ); em.persist( warsaw ); em.getTransaction().commit(); lukaszId = lukasz.getId(); kingaId = kinga.getId(); warsawId = warsaw.getId(); // Revision 2 em.getTransaction().begin(); kinga = em.find( Person.class, kinga.getId() ); Address cracow = new Address( "Cracow" ); kinga.getAddresses().add( cracow ); cracow.getTenants().add( kinga ); cracow.setLandlord( kinga ); em.persist( cracow ); em.getTransaction().commit(); cracowId = cracow.getId(); // Revision 3 em.getTransaction().begin(); cracow = em.find( Address.class, cracow.getId() ); cracow.setCity( "Krakow" ); em.merge( cracow ); em.getTransaction().commit(); // Revision 4 em.getTransaction().begin(); lukasz = em.find( Person.class, lukasz.getId() ); lukasz.setName( "Lucas" ); em.merge( lukasz ); em.getTransaction().commit(); // Revision 5 em.getTransaction().begin(); warsaw = em.find( Address.class, warsaw.getId() ); lukasz = em.find( Person.class, lukasz.getId() ); kinga = em.find( Person.class, kinga.getId() ); warsaw.setLandlord( kinga ); kinga.getOwnedAddresses().add( warsaw ); lukasz.getOwnedAddresses().remove( warsaw ); em.merge( warsaw ); em.merge( lukasz ); em.merge( kinga ); em.getTransaction().commit(); } @Test public void testRevisionsCounts() { Assert.assertEquals( Arrays.asList( 1, 4, 5 ), getAuditReader().getRevisions( Person.class, lukaszId ) ); Assert.assertEquals( Arrays.asList( 1, 2, 5 ), getAuditReader().getRevisions( Person.class, kingaId ) ); Assert.assertEquals( Arrays.asList( 1, 5 ), getAuditReader().getRevisions( Address.class, warsawId ) ); Assert.assertEquals( Arrays.asList( 2, 3 ), getAuditReader().getRevisions( Address.class, cracowId ) ); } @Test public void testHistoryOfLukasz() { Person lukasz = new Person( "Lukasz", lukaszId ); Address warsaw = new Address( "Warsaw", warsawId ); lukasz.getAddresses().add( warsaw ); lukasz.getOwnedAddresses().add( warsaw ); Person ver1 = getAuditReader().find( Person.class, lukaszId, 1 ); Assert.assertEquals( lukasz, ver1 ); Assert.assertEquals( lukasz.getAddresses(), ver1.getAddresses() ); Assert.assertEquals( lukasz.getOwnedAddresses(), ver1.getOwnedAddresses() ); lukasz.setName( "Lucas" ); Person ver4 = getAuditReader().find( Person.class, lukaszId, 4 ); Assert.assertEquals( lukasz, ver4 ); lukasz.getOwnedAddresses().remove( warsaw ); Person ver5 = getAuditReader().find( Person.class, lukaszId, 5 ); Assert.assertEquals( lukasz.getOwnedAddresses(), ver5.getOwnedAddresses() ); } @Test public void testHistoryOfKinga() { Person kinga = new Person( "Kinga", kingaId ); Address warsaw = new Address( "Warsaw", warsawId ); kinga.getAddresses().add( warsaw ); Person ver1 = getAuditReader().find( Person.class, kingaId, 1 ); Assert.assertEquals( kinga, ver1 ); Assert.assertEquals( kinga.getAddresses(), ver1.getAddresses() ); Assert.assertEquals( kinga.getOwnedAddresses(), ver1.getOwnedAddresses() ); Address cracow = new Address( "Cracow", cracowId ); kinga.getOwnedAddresses().add( cracow ); kinga.getAddresses().add( cracow ); Person ver2 = getAuditReader().find( Person.class, kingaId, 2 ); Assert.assertEquals( kinga, ver2 ); Assert.assertEquals( kinga.getAddresses(), ver2.getAddresses() ); Assert.assertEquals( kinga.getOwnedAddresses(), ver2.getOwnedAddresses() ); kinga.getOwnedAddresses().add( warsaw ); cracow.setCity( "Krakow" ); Person ver5 = getAuditReader().find( Person.class, kingaId, 5 ); Assert.assertEquals( TestTools.makeSet( kinga.getAddresses() ), TestTools.makeSet( ver5.getAddresses() ) ); Assert.assertEquals( TestTools.makeSet( kinga.getOwnedAddresses() ), TestTools.makeSet( ver5.getOwnedAddresses() ) ); } @Test public void testHistoryOfCracow() { Address cracow = new Address( "Cracow", cracowId ); Person kinga = new Person( "Kinga", kingaId ); cracow.getTenants().add( kinga ); cracow.setLandlord( kinga ); Address ver2 = getAuditReader().find( Address.class, cracowId, 2 ); Assert.assertEquals( cracow, ver2 ); Assert.assertEquals( cracow.getTenants(), ver2.getTenants() ); Assert.assertEquals( cracow.getLandlord().getId(), ver2.getLandlord().getId() ); cracow.setCity( "Krakow" ); Address ver3 = getAuditReader().find( Address.class, cracowId, 3 ); Assert.assertEquals( cracow, ver3 ); } @Test public void testHistoryOfWarsaw() { Address warsaw = new Address( "Warsaw", warsawId ); Person kinga = new Person( "Kinga", kingaId ); Person lukasz = new Person( "Lukasz", lukaszId ); warsaw.getTenants().add( lukasz ); warsaw.getTenants().add( kinga ); warsaw.setLandlord( lukasz ); Address ver1 = getAuditReader().find( Address.class, warsawId, 1 ); Assert.assertEquals( warsaw, ver1 ); Assert.assertEquals( warsaw.getTenants(), ver1.getTenants() ); Assert.assertEquals( warsaw.getLandlord().getId(), ver1.getLandlord().getId() ); warsaw.setLandlord( kinga ); Address ver5 = getAuditReader().find( Address.class, warsawId, 5 ); Assert.assertEquals( warsaw.getLandlord().getId(), ver5.getLandlord().getId() ); } }