/*
* 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.reference;
import java.util.Arrays;
import javax.persistence.EntityManager;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.tools.TestTools;
import org.junit.Test;
/**
* @author Adam Warski (adam at warski dot org)
*/
public class BidirectionalReference extends BaseEnversJPAFunctionalTestCase {
private Long set1_id;
private Long set2_id;
private Long g1_id;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {GreetingPO.class, GreetingSetPO.class};
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getEntityManager();
GreetingSetPO set1 = new GreetingSetPO();
set1.setName( "a1" );
GreetingSetPO set2 = new GreetingSetPO();
set2.setName( "a2" );
// Revision 1
em.getTransaction().begin();
em.persist( set1 );
em.persist( set2 );
set1_id = set1.getId();
set2_id = set2.getId();
em.getTransaction().commit();
em.clear();
// Revision 2
em.getTransaction().begin();
GreetingPO g1 = new GreetingPO();
g1.setGreeting( "g1" );
g1.setGreetingSet( em.getReference( GreetingSetPO.class, set1_id ) );
em.persist( g1 );
g1_id = g1.getId();
em.getTransaction().commit();
em.clear();
// Revision 3
em.getTransaction().begin();
g1 = em.find( GreetingPO.class, g1_id );
g1.setGreetingSet( em.getReference( GreetingSetPO.class, set2_id ) );
em.getTransaction().commit();
}
@Test
public void testRevisionsCounts() {
assert Arrays.asList( 2, 3 ).equals( getAuditReader().getRevisions( GreetingPO.class, g1_id ) );
assert Arrays.asList( 1, 2, 3 ).equals( getAuditReader().getRevisions( GreetingSetPO.class, set1_id ) );
assert Arrays.asList( 1, 3 ).equals( getAuditReader().getRevisions( GreetingSetPO.class, set2_id ) );
}
@Test
public void testHistoryOfG1() {
GreetingPO rev1 = getAuditReader().find( GreetingPO.class, g1_id, 1 );
GreetingPO rev2 = getAuditReader().find( GreetingPO.class, g1_id, 2 );
GreetingPO rev3 = getAuditReader().find( GreetingPO.class, g1_id, 3 );
assert rev1 == null;
assert rev2.getGreetingSet().getName().equals( "a1" );
assert rev3.getGreetingSet().getName().equals( "a2" );
}
@Test
public void testHistoryOfSet1() {
GreetingSetPO rev1 = getAuditReader().find( GreetingSetPO.class, set1_id, 1 );
GreetingSetPO rev2 = getAuditReader().find( GreetingSetPO.class, set1_id, 2 );
GreetingSetPO rev3 = getAuditReader().find( GreetingSetPO.class, set1_id, 3 );
assert rev1.getName().equals( "a1" );
assert rev2.getName().equals( "a1" );
assert rev3.getName().equals( "a1" );
GreetingPO g1 = new GreetingPO();
g1.setId( g1_id );
g1.setGreeting( "g1" );
assert rev1.getGreetings().size() == 0;
assert rev2.getGreetings().equals( TestTools.makeSet( g1 ) );
assert rev3.getGreetings().size() == 0;
}
@Test
public void testHistoryOfSet2() {
GreetingSetPO rev1 = getAuditReader().find( GreetingSetPO.class, set2_id, 1 );
GreetingSetPO rev2 = getAuditReader().find( GreetingSetPO.class, set2_id, 2 );
GreetingSetPO rev3 = getAuditReader().find( GreetingSetPO.class, set2_id, 3 );
assert rev1.getName().equals( "a2" );
assert rev2.getName().equals( "a2" );
assert rev3.getName().equals( "a2" );
GreetingPO g1 = new GreetingPO();
g1.setId( g1_id );
g1.setGreeting( "g1" );
assert rev1.getGreetings().size() == 0;
assert rev2.getGreetings().size() == 0;
assert rev3.getGreetings().equals( TestTools.makeSet( g1 ) );
}
}