From 9da97f8201ffa9f17f259d82bc6f964ad72c3434 Mon Sep 17 00:00:00 2001 From: VladoKuruc Date: Fri, 5 Jun 2020 10:36:33 +0200 Subject: [PATCH] HHH-14061 Add test showing the issue has been resolved --- .../entities/onetomany/SetRefEdEntity.java | 19 ++- .../entities/onetomany/SetRefIngEntity.java | 3 +- ...yLazyJtaSessionClosedBeforeCommitTest.java | 114 ++++++++++++++++++ 3 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java diff --git a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefEdEntity.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefEdEntity.java index c4091818d980..56b7d9708561 100644 --- a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefEdEntity.java +++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefEdEntity.java @@ -5,11 +5,16 @@ package org.hibernate.orm.test.envers.entities.onetomany; import java.util.Set; + +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import org.hibernate.envers.Audited; +import org.hibernate.envers.RelationTargetAuditMode; /** * ReferencEd entity @@ -25,9 +30,13 @@ 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() { } @@ -64,6 +73,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/orm/test/envers/entities/onetomany/SetRefIngEntity.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefIngEntity.java index 8a1d6ba6b4f8..97524a6a65f2 100644 --- a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefIngEntity.java +++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/entities/onetomany/SetRefIngEntity.java @@ -5,6 +5,7 @@ package org.hibernate.orm.test.envers.entities.onetomany; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; @@ -24,7 +25,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/orm/test/envers/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java new file mode 100644 index 000000000000..31f94f7c70e8 --- /dev/null +++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/jta/OneToManyLazyJtaSessionClosedBeforeCommitTest.java @@ -0,0 +1,114 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.envers.integration.jta; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import jakarta.persistence.EntityManager; +import org.hibernate.FlushMode; +import org.hibernate.Session; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.orm.test.envers.BaseEnversJPAFunctionalTestCase; +import org.hibernate.orm.test.envers.Priority; +import org.hibernate.orm.test.envers.entities.onetomany.SetRefEdEntity; +import org.hibernate.orm.test.envers.entities.onetomany.SetRefIngEntity; +import org.hibernate.testing.jta.TestingJtaBootstrap; +import org.hibernate.testing.jta.TestingJtaPlatformImpl; +import org.hibernate.testing.orm.junit.JiraKey; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author VladoKuruc + */ +@JiraKey( value = "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 ) ); + } +}