Skip to content

Commit bbe408f

Browse files
HHH-8189 - Rollback audit records on flushed transaction rollback
1 parent 76fe91c commit bbe408f

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

hibernate-envers/src/main/java/org/hibernate/envers/synchronization/AuditProcessManager.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import org.hibernate.Transaction;
2929
import org.hibernate.action.spi.AfterTransactionCompletionProcess;
30+
import org.hibernate.action.spi.BeforeTransactionCompletionProcess;
3031
import org.hibernate.engine.spi.SessionImplementor;
3132
import org.hibernate.envers.revisioninfo.RevisionInfoGenerator;
3233
import org.hibernate.event.spi.EventSource;
@@ -53,7 +54,16 @@ public AuditProcess get(EventSource session) {
5354
auditProcess = new AuditProcess(revisionInfoGenerator, session);
5455
auditProcesses.put(transaction, auditProcess);
5556

56-
session.getActionQueue().registerProcess(auditProcess);
57+
session.getActionQueue().registerProcess(
58+
new BeforeTransactionCompletionProcess() {
59+
public void doBeforeTransactionCompletion(SessionImplementor session) {
60+
final AuditProcess process = auditProcesses.get( transaction );
61+
if ( process != null ) {
62+
process.doBeforeTransactionCompletion( session );
63+
}
64+
}
65+
}
66+
);
5767

5868
session.getActionQueue().registerProcess(new AfterTransactionCompletionProcess() {
5969
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) {

hibernate-envers/src/test/java/org/hibernate/envers/test/integration/basic/TransactionRollbackBehaviour.java

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package org.hibernate.envers.test.integration.basic;
22

33
import java.util.List;
4-
54
import javax.persistence.EntityManager;
65

7-
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
8-
import org.hibernate.envers.test.entities.IntTestEntity;
96
import org.junit.Assert;
107
import org.junit.Test;
118

9+
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
10+
import org.hibernate.envers.test.entities.IntTestEntity;
11+
import org.hibernate.testing.TestForIssue;
12+
1213
/**
1314
* @author Tomasz Dziurko (tdziurko at gmail dot com)
1415
*/
1516
public class TransactionRollbackBehaviour extends BaseEnversJPAFunctionalTestCase {
16-
1717
@Test
1818
public void testAuditRecordsRollback() {
1919
// Given
@@ -32,15 +32,39 @@ public void testAuditRecordsRollback() {
3232
em.getTransaction().commit();
3333

3434
// Then
35-
List<Number> revisionsForSavedClass = getAuditReader()
36-
.getRevisions( IntTestEntity.class, ite2Id );
37-
Assert.assertEquals( "There should be one revision for inserted entity",
38-
1, revisionsForSavedClass.size() );
39-
40-
List<Number> revisionsForRolledbackClass = getAuditReader()
41-
.getRevisions( IntTestEntity.class, rollbackedIteId );
42-
Assert.assertEquals( "There should be one revision for inserted entity",
43-
0, revisionsForRolledbackClass.size() );
35+
List<Number> revisionsForSavedClass = getAuditReader().getRevisions( IntTestEntity.class, ite2Id );
36+
Assert.assertEquals( "There should be one revision for inserted entity.", 1, revisionsForSavedClass.size() );
37+
38+
List<Number> revisionsForRolledbackClass = getAuditReader().getRevisions( IntTestEntity.class, rollbackedIteId );
39+
Assert.assertEquals( "There should be no revision for rolled back transaction.", 0, revisionsForRolledbackClass.size() );
40+
}
41+
42+
@Test
43+
@TestForIssue( jiraKey = "HHH-8189" )
44+
public void testFlushedAuditRecordsRollback() {
45+
// Given
46+
EntityManager em = getEntityManager();
47+
em.getTransaction().begin();
48+
IntTestEntity iteToRollback = new IntTestEntity( 30 );
49+
em.persist( iteToRollback );
50+
em.flush();
51+
Integer rollbackedIteId = iteToRollback.getId();
52+
em.getTransaction().rollback();
53+
54+
// When
55+
em.getTransaction().begin();
56+
IntTestEntity ite2 = new IntTestEntity( 50 );
57+
em.persist( ite2 );
58+
em.flush();
59+
Integer ite2Id = ite2.getId();
60+
em.getTransaction().commit();
61+
62+
// Then
63+
List<Number> revisionsForSavedClass = getAuditReader().getRevisions( IntTestEntity.class, ite2Id );
64+
Assert.assertEquals( "There should be one revision for inserted entity.", 1, revisionsForSavedClass.size() );
65+
66+
List<Number> revisionsForRolledbackClass = getAuditReader().getRevisions( IntTestEntity.class, rollbackedIteId );
67+
Assert.assertEquals( "There should be no revision for rolled back transaction.", 0, revisionsForRolledbackClass.size() );
4468
}
4569

4670
@Override

0 commit comments

Comments
 (0)