/* * 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.onetoone.bidirectional.primarykeyjoincolumn; import java.util.Arrays; import javax.persistence.EntityManager; 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; import org.junit.Assert; import org.junit.Test; /** * @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; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { Person.class, Account.class, AccountNotAuditedOwners.class, NotAuditedNoProxyPerson.class, 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 ) ); } }