diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefEdEntity.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefEdEntity.java index 276f39be8ad6..4221bc2b6903 100644 --- a/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefEdEntity.java +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefEdEntity.java @@ -7,11 +7,16 @@ package org.hibernate.envers.test.entities.onetomany; import java.util.Set; + +import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.Id; +import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import org.hibernate.envers.Audited; +import org.hibernate.envers.RelationTargetAuditMode; /** * ReferencEd entity @@ -27,8 +32,12 @@ public class SetRefEdEntity { private String data; @Audited - @OneToMany(mappedBy = "reference") + @OneToMany(fetch = FetchType.LAZY, mappedBy = "reference", cascade = CascadeType.ALL) private Set reffering; + + @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) + @ManyToOne(fetch = FetchType.LAZY) + private SetRefIngEntity ref; public SetRefEdEntity() { } @@ -66,6 +75,14 @@ public void setReffering(Set reffering) { this.reffering = reffering; } + public SetRefIngEntity getRef() { + return ref; + } + + public void setRef(SetRefIngEntity ref) { + this.ref = ref; + } + public boolean equals(Object o) { if ( this == o ) { return true; diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefIngEntity.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefIngEntity.java index 2fc673274973..31b82b0b0014 100644 --- a/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefIngEntity.java +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/entities/onetomany/SetRefIngEntity.java @@ -7,6 +7,7 @@ package org.hibernate.envers.test.entities.onetomany; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToOne; @@ -26,7 +27,7 @@ public class SetRefIngEntity { private String data; @Audited - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private SetRefEdEntity reference; public SetRefIngEntity() { diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java new file mode 100644 index 000000000000..76e6284cb158 --- /dev/null +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java @@ -0,0 +1,117 @@ +/* + * 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 . + */ +package org.hibernate.envers.test.integration.jta; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.persistence.EntityManager; + +import org.hibernate.FlushMode; +import org.hibernate.Session; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; +import org.hibernate.envers.test.Priority; +import org.hibernate.envers.test.entities.onetomany.SetRefEdEntity; +import org.hibernate.envers.test.entities.onetomany.SetRefIngEntity; +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.jta.TestingJtaBootstrap; +import org.hibernate.testing.jta.TestingJtaPlatformImpl; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author Andrea Boriero + * @author VladoKuruc + */ +@TestForIssue( jiraKey = "HHH-14061") +public class OneToManyLazyJtaSessionClosedBeforeCommitTest extends BaseEnversJPAFunctionalTestCase { + private Integer parentId; + private Integer entityId; + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] {SetRefIngEntity.class, SetRefEdEntity.class}; + } + + @Override + protected void addConfigOptions(Map options) { + TestingJtaBootstrap.prepare( options ); + options.put( AvailableSettings.ALLOW_JTA_TRANSACTION_ACCESS, "true" ); + } + + @Test + @Priority(10) + public void initData() throws Exception { + TestingJtaPlatformImpl.INSTANCE.getTransactionManager().begin(); + EntityManager entityManager = getEntityManager(); + try { + SetRefIngEntity refIngEntity = new SetRefIngEntity( 3, "ingEntityRef" ); + entityManager.persist( refIngEntity ); + + SetRefEdEntity edEntity = new SetRefEdEntity( 2, "edEntity" ); + edEntity.setRef(refIngEntity); + entityManager.persist( edEntity ); + parentId = edEntity.getId(); + + SetRefIngEntity ingEntity = new SetRefIngEntity( 1, "ingEntity" ); + + Set sries = new HashSet<>(); + sries.add( ingEntity ); + ingEntity.setReference( edEntity ); + edEntity.setReffering( sries ); + + entityManager.persist( ingEntity ); + + entityId = ingEntity.getId(); + } + finally { + entityManager.close(); + TestingJtaPlatformImpl.tryCommit(); + } + TestingJtaPlatformImpl.INSTANCE.getTransactionManager().begin(); + entityManager = getEntityManager(); + try { + entityManager.unwrap(Session.class).setHibernateFlushMode(FlushMode.MANUAL); + SetRefEdEntity edEntity = entityManager.find(SetRefEdEntity.class, parentId); + Set reffering = edEntity.getReffering(); + SetRefIngEntity ingEntity = reffering.iterator().next(); + ingEntity.setReference(null); + reffering.remove(ingEntity); + entityManager.merge(ingEntity); + entityManager.flush(); + //clear context in transaction + entityManager.clear(); + entityManager.merge(edEntity); + entityManager.flush(); + } + finally { + entityManager.close(); + TestingJtaPlatformImpl.tryCommit(); + } + } + + @Test + public void testRevisionCounts() { + assertEquals( + Arrays.asList(1, 2), + getAuditReader().getRevisions( SetRefIngEntity.class, entityId ) + ); + assertEquals( + Arrays.asList(1, 2), + getAuditReader().getRevisions( SetRefEdEntity.class, parentId ) + ); + } + + @Test + public void testRevisionHistory() { + assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( SetRefIngEntity.class, entityId ) ); + assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( SetRefEdEntity.class, parentId ) ); + } +}