package org.hibernate.envers.test.integration.multiplerelations;
import java.util.Arrays;
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-7073")
public class MultipleAssociationsTest extends BaseEnversJPAFunctionalTestCase {
private long lukaszId = 0;
private long kingaId = 0;
private long warsawId = 0;
private long cracowId = 0;
@Override
public void configure(Ejb3Configuration cfg) {
cfg.addAnnotatedClass(Person.class);
cfg.addAnnotatedClass(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());
}
}