/*
* 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.query;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import org.hibernate.envers.RevisionType;
import org.hibernate.envers.configuration.EnversSettings;
import org.hibernate.envers.enhanced.SequenceIdRevisionEntity;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.query.criteria.AuditCriterion;
import org.hibernate.envers.query.criteria.AuditDisjunction;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.StrIntTestEntity;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import junit.framework.Assert;
/**
* A test which checks if the data of a deleted entity is stored when the setting is on.
*
* @author Adam Warski (adam at warski dot org)
*/
@SuppressWarnings({"unchecked"})
public class StoreDeletedData extends BaseEnversJPAFunctionalTestCase {
private Integer id1;
private Integer id2;
private Integer id3;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {StrIntTestEntity.class};
}
@Override
protected void addConfigOptions(Map options) {
super.addConfigOptions( options );
options.put( EnversSettings.STORE_DATA_AT_DELETE, "true" );
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getEntityManager();
// Revision 1
em.getTransaction().begin();
StrIntTestEntity site1 = new StrIntTestEntity( "a", 10 );
em.persist( site1 );
id1 = site1.getId();
em.getTransaction().commit();
// Revision 2
em.getTransaction().begin();
em.remove( site1 );
em.getTransaction().commit();
// Revision 3
em.getTransaction().begin();
StrIntTestEntity site2 = new StrIntTestEntity( "b", 20 );
em.persist( site2 );
id2 = site2.getId();
StrIntTestEntity site3 = new StrIntTestEntity( "c", 30 );
em.persist( site3 );
id3 = site3.getId();
em.getTransaction().commit();
// Revision 4
em.getTransaction().begin();
em.remove( site2 );
em.remove( site3 );
em.getTransaction().commit();
em.close();
}
@Test
public void testRevisionsPropertyEqQuery() {
List revs_id1 = getAuditReader().createQuery()
.forRevisionsOfEntity( StrIntTestEntity.class, false, true )
.add( AuditEntity.id().eq( id1 ) )
.getResultList();
Assert.assertEquals( 2, revs_id1.size() );
Assert.assertEquals( new StrIntTestEntity( "a", 10, id1 ), ((Object[]) revs_id1.get( 0 ))[0] );
Assert.assertEquals( new StrIntTestEntity( "a", 10, id1 ), ((Object[]) revs_id1.get( 1 ))[0] );
}
@Test
@TestForIssue(jiraKey = "HHH-7800")
public void testMaximizeInDisjunction() {
List<Integer> queryIds = Arrays.asList( id2, id3 );
AuditDisjunction disjunction = AuditEntity.disjunction();
for ( Integer id : queryIds ) {
AuditCriterion crit = AuditEntity.revisionNumber().maximize()
.add( AuditEntity.id().eq( id ) )
.add( AuditEntity.revisionType().ne( RevisionType.DEL ) );
disjunction.add( crit );
// Workaround: using this line instead works correctly:
// disjunction.add(AuditEntity.conjunction().add(crit));
}
List<?> beforeDeletionRevisions = getAuditReader().createQuery()
.forRevisionsOfEntity( StrIntTestEntity.class, false, false )
.add( disjunction )
.addOrder( AuditEntity.property( "id" ).asc() )
.getResultList();
Assert.assertEquals( 2, beforeDeletionRevisions.size() );
Object[] result1 = (Object[]) beforeDeletionRevisions.get( 0 );
Object[] result2 = (Object[]) beforeDeletionRevisions.get( 1 );
Assert.assertEquals( new StrIntTestEntity( "b", 20, id2 ), result1[0] );
// Making sure that we have received an entity added at revision 3.
Assert.assertEquals( 3, ((SequenceIdRevisionEntity) result1[1]).getId() );
Assert.assertEquals( RevisionType.ADD, result1[2] );
Assert.assertEquals( new StrIntTestEntity( "c", 30, id3 ), result2[0] );
// Making sure that we have received an entity added at revision 3.
Assert.assertEquals( 3, ((SequenceIdRevisionEntity) result2[1]).getId() );
Assert.assertEquals( RevisionType.ADD, result2[2] );
}
}