/*
* 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.basic;
import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.entities.IntTestEntity;
import org.hibernate.internal.SessionImpl;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author Tomasz Dziurko (tdziurko at gmail dot com)
*/
public class TransactionRollbackBehaviour extends BaseEnversJPAFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {IntTestEntity.class};
}
@Test
public void testAuditRecordsRollbackWithAutoClear() {
testAuditRecordsRollbackBehavior( false, true );
}
@Test
public void testAuditRecordsRollbackWithNoAutoClear() {
testAuditRecordsRollbackBehavior( false, false );
}
@Test
@TestForIssue(jiraKey = "HHH-8189")
public void testFlushedAuditRecordsRollback() {
// default auto-clear behavior
testAuditRecordsRollbackBehavior( true, null );
}
private void testAuditRecordsRollbackBehavior(boolean flush, Boolean autoClear) {
EntityManager entityManager = getEntityManager();
try {
if ( autoClear != null ) {
entityManager.unwrap( SessionImpl.class ).setAutoClear( autoClear );
}
// persist and rollback
entityManager.getTransaction().begin();
IntTestEntity rollbackEntity = new IntTestEntity( 30 );
entityManager.persist( rollbackEntity );
if ( flush ) {
entityManager.flush();
}
Integer rollbackId = rollbackEntity.getId();
entityManager.getTransaction().rollback();
// persist and commit
entityManager.getTransaction().begin();
IntTestEntity commitEntity = new IntTestEntity( 50 );
entityManager.persist( commitEntity );
if ( flush ) {
entityManager.flush();
}
Integer commitId = commitEntity.getId();
entityManager.getTransaction().commit();
List<Number> revisionsForSavedClass = getAuditReader().getRevisions(
IntTestEntity.class,
commitId
);
assertEquals( "There should be one revision for inserted entity.", 1, revisionsForSavedClass.size() );
List<Number> revisionsForRolledbackClass = getAuditReader().getRevisions(
IntTestEntity.class,
rollbackId
);
assertEquals( "There should be no revision for rolled back entity.", 0, revisionsForRolledbackClass.size() );
}
finally {
entityManager.close();
}
}
}