/* * 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.proxy; import javax.persistence.EntityManager; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.UnversionedStrTestEntity; import org.hibernate.envers.test.entities.manytomany.unidirectional.ManyToManyNotAuditedNullEntity; import org.hibernate.envers.test.entities.manytoone.unidirectional.ExtManyToOneNotAuditedNullEntity; import org.hibernate.envers.test.entities.manytoone.unidirectional.ManyToOneNotAuditedNullEntity; import org.hibernate.envers.test.entities.manytoone.unidirectional.TargetNotAuditedEntity; import org.hibernate.envers.test.entities.onetomany.OneToManyNotAuditedNullEntity; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.LazyInitializer; import org.hibernate.testing.TestForIssue; import org.junit.Assert; import org.junit.Test; /** * @author Eugene Goroschenya */ public class ProxyIdentifier extends BaseEnversJPAFunctionalTestCase { private TargetNotAuditedEntity tnae1 = null; private ManyToOneNotAuditedNullEntity mtonane1 = null; private ExtManyToOneNotAuditedNullEntity emtonane1 = null; private ManyToManyNotAuditedNullEntity mtmnane1 = null; private OneToManyNotAuditedNullEntity otmnane1 = null; private UnversionedStrTestEntity uste1 = null; private UnversionedStrTestEntity uste2 = null; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { TargetNotAuditedEntity.class, ManyToOneNotAuditedNullEntity.class, UnversionedStrTestEntity.class, ManyToManyNotAuditedNullEntity.class, OneToManyNotAuditedNullEntity.class, ExtManyToOneNotAuditedNullEntity.class }; } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); uste1 = new UnversionedStrTestEntity( "str1" ); uste2 = new UnversionedStrTestEntity( "str2" ); // No revision em.getTransaction().begin(); em.persist( uste1 ); em.persist( uste2 ); em.getTransaction().commit(); // Revision 1 em.getTransaction().begin(); uste1 = em.find( UnversionedStrTestEntity.class, uste1.getId() ); tnae1 = new TargetNotAuditedEntity( 1, "tnae1", uste1 ); em.persist( tnae1 ); em.getTransaction().commit(); // Revision 2 em.getTransaction().begin(); uste2 = em.find( UnversionedStrTestEntity.class, uste2.getId() ); mtonane1 = new ManyToOneNotAuditedNullEntity( 2, "mtonane1", uste2 ); mtmnane1 = new ManyToManyNotAuditedNullEntity( 3, "mtmnane1" ); mtmnane1.getReferences().add( uste2 ); otmnane1 = new OneToManyNotAuditedNullEntity( 4, "otmnane1" ); otmnane1.getReferences().add( uste2 ); emtonane1 = new ExtManyToOneNotAuditedNullEntity( 5, "emtonane1", uste2, "extension" ); em.persist( mtonane1 ); em.persist( mtmnane1 ); em.persist( otmnane1 ); em.persist( emtonane1 ); em.getTransaction().commit(); em.clear(); // Revision 3 // Remove not audited target entity, so we can verify null reference // when @NotFound(action = NotFoundAction.IGNORE) applied. em.getTransaction().begin(); ManyToOneNotAuditedNullEntity tmp1 = em.find( ManyToOneNotAuditedNullEntity.class, mtonane1.getId() ); tmp1.setReference( null ); tmp1 = em.merge( tmp1 ); ManyToManyNotAuditedNullEntity tmp2 = em.find( ManyToManyNotAuditedNullEntity.class, mtmnane1.getId() ); tmp2.setReferences( null ); tmp2 = em.merge( tmp2 ); OneToManyNotAuditedNullEntity tmp3 = em.find( OneToManyNotAuditedNullEntity.class, otmnane1.getId() ); tmp3.setReferences( null ); tmp3 = em.merge( tmp3 ); ExtManyToOneNotAuditedNullEntity tmp4 = em.find( ExtManyToOneNotAuditedNullEntity.class, emtonane1.getId() ); tmp4.setReference( null ); tmp4 = em.merge( tmp4 ); em.remove( em.getReference( UnversionedStrTestEntity.class, uste2.getId() ) ); em.getTransaction().commit(); em.close(); } @Test public void testProxyIdentifier() { TargetNotAuditedEntity rev1 = getAuditReader().find( TargetNotAuditedEntity.class, tnae1.getId(), 1 ); Assert.assertTrue( rev1.getReference() instanceof HibernateProxy ); HibernateProxy proxyCreateByEnvers = (HibernateProxy) rev1.getReference(); LazyInitializer lazyInitializer = proxyCreateByEnvers.getHibernateLazyInitializer(); Assert.assertTrue( lazyInitializer.isUninitialized() ); Assert.assertNotNull( lazyInitializer.getIdentifier() ); Assert.assertEquals( tnae1.getId(), lazyInitializer.getIdentifier() ); Assert.assertTrue( lazyInitializer.isUninitialized() ); Assert.assertEquals( uste1.getId(), rev1.getReference().getId() ); Assert.assertEquals( uste1.getStr(), rev1.getReference().getStr() ); Assert.assertFalse( lazyInitializer.isUninitialized() ); } @Test @TestForIssue( jiraKey = "HHH-8174" ) public void testNullReferenceWithNotFoundActionIgnore() { ManyToOneNotAuditedNullEntity mtoRev2 = getAuditReader().find( ManyToOneNotAuditedNullEntity.class, mtonane1.getId(), 2 ); Assert.assertEquals( mtonane1, mtoRev2 ); Assert.assertNull( mtoRev2.getReference() ); ManyToManyNotAuditedNullEntity mtmRev2 = getAuditReader().find( ManyToManyNotAuditedNullEntity.class, mtmnane1.getId(), 2 ); Assert.assertEquals( mtmnane1, mtmRev2 ); Assert.assertTrue( mtmRev2.getReferences().isEmpty() ); OneToManyNotAuditedNullEntity otmRev2 = getAuditReader().find( OneToManyNotAuditedNullEntity.class, otmnane1.getId(), 2 ); Assert.assertEquals( otmnane1, otmRev2 ); Assert.assertTrue( otmRev2.getReferences().isEmpty() ); } @Test @TestForIssue( jiraKey = "HHH-8912" ) public void testNullReferenceWithNotFoundActionIgnoreInParent() { ExtManyToOneNotAuditedNullEntity emtoRev2 = getAuditReader().find( ExtManyToOneNotAuditedNullEntity.class, emtonane1.getId(), 2 ); Assert.assertEquals( emtonane1, emtoRev2 ); Assert.assertNull( emtoRev2.getReference() ); } }