HHH-8189 - Rollback audit records on flushed transaction rollback
This commit is contained in:
parent
76fe91cf4a
commit
bbe408f994
|
@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
import org.hibernate.action.spi.AfterTransactionCompletionProcess;
|
import org.hibernate.action.spi.AfterTransactionCompletionProcess;
|
||||||
|
import org.hibernate.action.spi.BeforeTransactionCompletionProcess;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.envers.revisioninfo.RevisionInfoGenerator;
|
import org.hibernate.envers.revisioninfo.RevisionInfoGenerator;
|
||||||
import org.hibernate.event.spi.EventSource;
|
import org.hibernate.event.spi.EventSource;
|
||||||
|
@ -53,7 +54,16 @@ public class AuditProcessManager {
|
||||||
auditProcess = new AuditProcess(revisionInfoGenerator, session);
|
auditProcess = new AuditProcess(revisionInfoGenerator, session);
|
||||||
auditProcesses.put(transaction, auditProcess);
|
auditProcesses.put(transaction, auditProcess);
|
||||||
|
|
||||||
session.getActionQueue().registerProcess(auditProcess);
|
session.getActionQueue().registerProcess(
|
||||||
|
new BeforeTransactionCompletionProcess() {
|
||||||
|
public void doBeforeTransactionCompletion(SessionImplementor session) {
|
||||||
|
final AuditProcess process = auditProcesses.get( transaction );
|
||||||
|
if ( process != null ) {
|
||||||
|
process.doBeforeTransactionCompletion( session );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
session.getActionQueue().registerProcess(new AfterTransactionCompletionProcess() {
|
session.getActionQueue().registerProcess(new AfterTransactionCompletionProcess() {
|
||||||
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) {
|
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) {
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
package org.hibernate.envers.test.integration.basic;
|
package org.hibernate.envers.test.integration.basic;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||||
import org.hibernate.envers.test.entities.IntTestEntity;
|
import org.hibernate.envers.test.entities.IntTestEntity;
|
||||||
import org.junit.Assert;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Tomasz Dziurko (tdziurko at gmail dot com)
|
* @author Tomasz Dziurko (tdziurko at gmail dot com)
|
||||||
*/
|
*/
|
||||||
public class TransactionRollbackBehaviour extends BaseEnversJPAFunctionalTestCase {
|
public class TransactionRollbackBehaviour extends BaseEnversJPAFunctionalTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAuditRecordsRollback() {
|
public void testAuditRecordsRollback() {
|
||||||
// Given
|
// Given
|
||||||
|
@ -32,15 +32,39 @@ public class TransactionRollbackBehaviour extends BaseEnversJPAFunctionalTestCas
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
List<Number> revisionsForSavedClass = getAuditReader()
|
List<Number> revisionsForSavedClass = getAuditReader().getRevisions( IntTestEntity.class, ite2Id );
|
||||||
.getRevisions( IntTestEntity.class, ite2Id );
|
Assert.assertEquals( "There should be one revision for inserted entity.", 1, revisionsForSavedClass.size() );
|
||||||
Assert.assertEquals( "There should be one revision for inserted entity",
|
|
||||||
1, revisionsForSavedClass.size() );
|
|
||||||
|
|
||||||
List<Number> revisionsForRolledbackClass = getAuditReader()
|
List<Number> revisionsForRolledbackClass = getAuditReader().getRevisions( IntTestEntity.class, rollbackedIteId );
|
||||||
.getRevisions( IntTestEntity.class, rollbackedIteId );
|
Assert.assertEquals( "There should be no revision for rolled back transaction.", 0, revisionsForRolledbackClass.size() );
|
||||||
Assert.assertEquals( "There should be one revision for inserted entity",
|
}
|
||||||
0, revisionsForRolledbackClass.size() );
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-8189" )
|
||||||
|
public void testFlushedAuditRecordsRollback() {
|
||||||
|
// Given
|
||||||
|
EntityManager em = getEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
IntTestEntity iteToRollback = new IntTestEntity( 30 );
|
||||||
|
em.persist( iteToRollback );
|
||||||
|
em.flush();
|
||||||
|
Integer rollbackedIteId = iteToRollback.getId();
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
|
||||||
|
// When
|
||||||
|
em.getTransaction().begin();
|
||||||
|
IntTestEntity ite2 = new IntTestEntity( 50 );
|
||||||
|
em.persist( ite2 );
|
||||||
|
em.flush();
|
||||||
|
Integer ite2Id = ite2.getId();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
// Then
|
||||||
|
List<Number> revisionsForSavedClass = getAuditReader().getRevisions( IntTestEntity.class, ite2Id );
|
||||||
|
Assert.assertEquals( "There should be one revision for inserted entity.", 1, revisionsForSavedClass.size() );
|
||||||
|
|
||||||
|
List<Number> revisionsForRolledbackClass = getAuditReader().getRevisions( IntTestEntity.class, rollbackedIteId );
|
||||||
|
Assert.assertEquals( "There should be no revision for rolled back transaction.", 0, revisionsForRolledbackClass.size() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue