/*
* 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.onetomany.idclass;
import java.util.Arrays;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.transaction.TransactionUtil;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
/**
* @author Chris Cranford
*/
@TestForIssue(jiraKey = "HHH-7625")
public class OneToManyCompositeKeyTest extends BaseEnversJPAFunctionalTestCase {
private ManyToManyCompositeKey.ManyToManyId owning1Id = null;
private ManyToManyCompositeKey.ManyToManyId owning2Id = null;
private Long oneToManyId;
private Long manyToOne1Id;
private Long manyToOne2Id;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { OneToManyOwned.class, ManyToManyCompositeKey.class, ManyToOneOwned.class };
}
@Test
@Priority(10)
public void initData() {
// Revision 1
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
OneToManyOwned oneToManyOwned = new OneToManyOwned( "data", null );
ManyToOneOwned manyToOneOwned1 = new ManyToOneOwned( "data1" );
ManyToOneOwned manyToOneOwned2 = new ManyToOneOwned( "data2" );
ManyToManyCompositeKey owning1 = new ManyToManyCompositeKey( oneToManyOwned, manyToOneOwned1 );
ManyToManyCompositeKey owning2 = new ManyToManyCompositeKey( oneToManyOwned, manyToOneOwned2 );
entityManager.persist(oneToManyOwned);
entityManager.persist(manyToOneOwned1);
entityManager.persist(manyToOneOwned2);
entityManager.persist( owning1 );
entityManager.persist( owning2 );
owning1Id = owning1.getId();
owning2Id = owning2.getId();
oneToManyId = oneToManyOwned.getId();
manyToOne1Id = manyToOneOwned1.getId();
manyToOne2Id = manyToOneOwned2.getId();
} );
// Revision 2
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
ManyToManyCompositeKey owning1 = entityManager.find( ManyToManyCompositeKey.class, owning1Id );
entityManager.remove( owning1 );
} );
// Revision 3
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
ManyToManyCompositeKey owning2 = entityManager.find( ManyToManyCompositeKey.class, owning2Id );
entityManager.remove( owning2 );
} );
}
@Test
public void testRevisionsCounts() {
assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( ManyToManyCompositeKey.class, owning1Id ) );
assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( ManyToManyCompositeKey.class, owning2Id ) );
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( OneToManyOwned.class, oneToManyId ) );
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( ManyToOneOwned.class, manyToOne1Id ) );
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( ManyToOneOwned.class, manyToOne2Id ) );
}
@Test
public void testOneToManyHistory() {
final OneToManyOwned rev1 = getAuditReader().find( OneToManyOwned.class, oneToManyId, 1 );
assertEquals( "data", rev1.getData() );
assertEquals( 2, rev1.getManyToManyCompositeKeys().size() );
}
@Test
public void testManyToOne1History() {
final ManyToOneOwned rev1 = getAuditReader().find( ManyToOneOwned.class, manyToOne1Id, 1 );
assertEquals( "data1", rev1.getData() );
}
@Test
public void testManyToOne2History() {
final ManyToOneOwned rev1 = getAuditReader().find( ManyToOneOwned.class, manyToOne2Id, 1 );
assertEquals( "data2", rev1.getData() );
}
@Test
public void testOwning1History() {
// objects
final OneToManyOwned oneToMany = new OneToManyOwned( 1L, "data", null );
final ManyToOneOwned manyToOne = new ManyToOneOwned( 2L, "data1" );
// insert revision
final ManyToManyCompositeKey rev1 = getAuditReader().find( ManyToManyCompositeKey.class, owning1Id, 1 );
assertEquals( rev1.getOneToMany(), oneToMany );
assertEquals( rev1.getManyToOne(), manyToOne );
// removal revision - find returns null for deleted
assertNull( getAuditReader().find( ManyToManyCompositeKey.class, owning1Id, 2 ) );
// fetch revision 2 using 'select deletions' api and verify.
final ManyToManyCompositeKey rev2 = (ManyToManyCompositeKey) getAuditReader()
.createQuery()
.forRevisionsOfEntity( ManyToManyCompositeKey.class, true, true )
.add( AuditEntity.id().eq( owning1Id ) )
.add( AuditEntity.revisionNumber().eq( 2 ) )
.getSingleResult();
assertEquals( rev2.getOneToMany(), oneToMany );
assertEquals( rev2.getManyToOne(), manyToOne );
}
@Test
public void testOwning2History() {
// objects
final OneToManyOwned oneToMany = new OneToManyOwned( 1L, "data", null );
final ManyToOneOwned manyToOne = new ManyToOneOwned( 3L, "data2" );
// insert revision
final ManyToManyCompositeKey rev1 = getAuditReader().find( ManyToManyCompositeKey.class, owning2Id, 1 );
assertEquals( rev1.getOneToMany(), oneToMany );
assertEquals( rev1.getManyToOne(), manyToOne );
// removal revision - find returns null for deleted
assertNull( getAuditReader().find( ManyToManyCompositeKey.class, owning2Id, 3 ) );
// fetch revision 3 using 'select deletions' api and verify.
final ManyToManyCompositeKey rev2 = (ManyToManyCompositeKey) getAuditReader()
.createQuery()
.forRevisionsOfEntity( ManyToManyCompositeKey.class, true, true )
.add( AuditEntity.id().eq( owning2Id ) )
.add( AuditEntity.revisionNumber().eq( 3 ) )
.getSingleResult();
assertEquals( rev2.getOneToMany(), oneToMany );
assertEquals( rev2.getManyToOne(), manyToOne );
}
}