package org.hibernate.envers.test.integration.onetoone.bidirectional.primarykeyjoincolumn; 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.RevisionType; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.proxy.HibernateProxy; import org.hibernate.testing.TestForIssue; /** * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ @TestForIssue(jiraKey = "HHH-6825") public class OneToOneWithPrimaryKeyJoinTest extends BaseEnversJPAFunctionalTestCase { private Long personId = null; private Long accountId = null; private Long proxyPersonId = null; private Long noProxyPersonId = null; private Long accountNotAuditedOwnersId = null; public void configure(Ejb3Configuration cfg) { cfg.addAnnotatedClass(Person.class); cfg.addAnnotatedClass(Account.class); cfg.addAnnotatedClass(AccountNotAuditedOwners.class); cfg.addAnnotatedClass(NotAuditedNoProxyPerson.class); cfg.addAnnotatedClass(NotAuditedProxyPerson.class); } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // Revision 1 em.getTransaction().begin(); Person person = new Person("Robert"); Account account = new Account("Saving"); person.setAccount(account); account.setOwner(person); em.persist(person); em.persist(account); em.getTransaction().commit(); // Revision 2 em.getTransaction().begin(); NotAuditedNoProxyPerson noProxyPerson = new NotAuditedNoProxyPerson("Kinga"); NotAuditedProxyPerson proxyPerson = new NotAuditedProxyPerson("Lukasz"); AccountNotAuditedOwners accountNotAuditedOwners = new AccountNotAuditedOwners("Standard"); noProxyPerson.setAccount(accountNotAuditedOwners); proxyPerson.setAccount(accountNotAuditedOwners); accountNotAuditedOwners.setOwner(noProxyPerson); accountNotAuditedOwners.setCoOwner(proxyPerson); em.persist(accountNotAuditedOwners); em.persist(noProxyPerson); em.persist(proxyPerson); em.getTransaction().commit(); personId = person.getPersonId(); accountId = account.getAccountId(); accountNotAuditedOwnersId = accountNotAuditedOwners.getAccountId(); proxyPersonId = proxyPerson.getPersonId(); noProxyPersonId = noProxyPerson.getPersonId(); } @Test public void testRevisionsCounts() { Assert.assertEquals(Arrays.asList(1), getAuditReader().getRevisions(Person.class, personId)); Assert.assertEquals(Arrays.asList(1), getAuditReader().getRevisions(Account.class, accountId)); Assert.assertEquals(Arrays.asList(2), getAuditReader().getRevisions(AccountNotAuditedOwners.class, accountNotAuditedOwnersId)); } @Test public void testHistoryOfPerson() { Person personVer1 = new Person(personId, "Robert"); Account accountVer1 = new Account(accountId, "Saving"); personVer1.setAccount(accountVer1); accountVer1.setOwner(personVer1); Object[] result = ((Object[]) getAuditReader().createQuery().forRevisionsOfEntity(Person.class, false, true) .add(AuditEntity.id().eq(personId)) .getResultList().get(0)); Assert.assertEquals(personVer1, result[0]); Assert.assertEquals(personVer1.getAccount(), ((Person)result[0]).getAccount()); Assert.assertEquals(RevisionType.ADD, result[2]); Assert.assertEquals(personVer1, getAuditReader().find(Person.class, personId, 1)); } @Test public void testHistoryOfAccount() { Person personVer1 = new Person(personId, "Robert"); Account accountVer1 = new Account(accountId, "Saving"); personVer1.setAccount(accountVer1); accountVer1.setOwner(personVer1); Object[] result = ((Object[]) getAuditReader().createQuery().forRevisionsOfEntity(Account.class, false, true) .add(AuditEntity.id().eq(accountId)) .getResultList().get(0)); Assert.assertEquals(accountVer1, result[0]); Assert.assertEquals(accountVer1.getOwner(), ((Account)result[0]).getOwner()); Assert.assertEquals(RevisionType.ADD, result[2]); Assert.assertEquals(accountVer1, getAuditReader().find(Account.class, accountId, 1)); } @Test public void testHistoryOfAccountNotAuditedOwners() { NotAuditedNoProxyPerson noProxyPersonVer1 = new NotAuditedNoProxyPerson(noProxyPersonId, "Kinga"); NotAuditedProxyPerson proxyPersonVer1 = new NotAuditedProxyPerson(proxyPersonId, "Lukasz"); AccountNotAuditedOwners accountNotAuditedOwnersVer1 = new AccountNotAuditedOwners(accountNotAuditedOwnersId, "Standard"); noProxyPersonVer1.setAccount(accountNotAuditedOwnersVer1); proxyPersonVer1.setAccount(accountNotAuditedOwnersVer1); accountNotAuditedOwnersVer1.setOwner(noProxyPersonVer1); accountNotAuditedOwnersVer1.setCoOwner(proxyPersonVer1); Object[] result = ((Object[]) getAuditReader().createQuery().forRevisionsOfEntity(AccountNotAuditedOwners.class, false, true) .add(AuditEntity.id().eq(accountNotAuditedOwnersId)) .getResultList().get(0)); Assert.assertEquals(accountNotAuditedOwnersVer1, result[0]); Assert.assertEquals(RevisionType.ADD, result[2]); // Checking non-proxy reference Assert.assertEquals(accountNotAuditedOwnersVer1.getOwner(), ((AccountNotAuditedOwners)result[0]).getOwner()); // Checking proxy reference Assert.assertTrue(((AccountNotAuditedOwners)result[0]).getCoOwner() instanceof HibernateProxy); Assert.assertEquals(proxyPersonVer1.getPersonId(), ((AccountNotAuditedOwners)result[0]).getCoOwner().getPersonId()); Assert.assertEquals(accountNotAuditedOwnersVer1, getAuditReader().find(AccountNotAuditedOwners.class, accountNotAuditedOwnersId, 2)); } }