/*
* 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.relatedid;
import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.query.AuditQuery;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.tools.TestTools;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
/**
* @author Chris Cranford
*/
@TestForIssue(jiraKey = "HHH-8070")
public class AuditRelatedIdInTest extends BaseEnversJPAFunctionalTestCase {
private Integer company1Id;
private Integer company2Id;
private Integer company3Id;
private Integer employee1Id;
private Integer employee2Id;
private Integer employee3Id;
private Integer employee4Id;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[]{
Company.class,
Employee.class
};
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getOrCreateEntityManager();
try {
// Revision 1
Company company1 = new Company( "COMPANY1" );
Company company2 = new Company( "COMPANY2" );
Employee employee1 = new Employee( "Employee1", company1 );
Employee employee2 = new Employee( "Employee2", company2 );
Employee employee3 = new Employee( "Employee3", company2 );
em.getTransaction().begin();
em.persist( company1 );
em.persist( company2 );
em.persist( employee1 );
em.persist( employee2 );
em.persist( employee3 );
em.getTransaction().commit();
// cache ids
company1Id = company1.getId();
company2Id = company2.getId();
employee1Id = employee1.getId();
employee2Id = employee2.getId();
employee3Id = employee3.getId();
// Revision 2
em.getTransaction().begin();
employee2 = em.find( Employee.class, employee2.getId() );
employee2.setCompany( company1 );
company2 = em.find( Company.class, company2.getId() );
company2.setName( "COMPANY2-CHANGED" );
em.merge( employee2 );
em.merge( company2 );
em.getTransaction().commit();
// Revision 3
Company company3 = new Company( "COMPANY3" );
Employee employee4 = new Employee( "Employee4", company3 );
em.getTransaction().begin();
em.persist( company3 );
em.persist( employee4 );
em.getTransaction().commit();
// cache ids
employee4Id = employee4.getId();
company3Id = company3.getId();
}
finally {
em.close();
}
}
@Test
public void testRevisionCounts() {
// companies
assertEquals( 1, getAuditReader().getRevisions( Company.class, company1Id ).size() );
assertEquals( 2, getAuditReader().getRevisions( Company.class, company2Id ).size() );
assertEquals( 1, getAuditReader().getRevisions( Company.class, company3Id ).size() );
// employees
assertEquals( 1, getAuditReader().getRevisions( Employee.class, employee1Id ).size() );
assertEquals( 2, getAuditReader().getRevisions( Employee.class, employee2Id ).size() );
assertEquals( 1, getAuditReader().getRevisions( Employee.class, employee3Id ).size() );
assertEquals( 1, getAuditReader().getRevisions( Employee.class, employee4Id ).size() );
}
@Test
public void testCompany1EmployeeIn() {
AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity( Employee.class, true, true );
auditQuery.add( AuditEntity.relatedId( "company" ).in( new Integer[]{ company1Id } ) );
final List<Employee> results = auditQuery.getResultList();
assertEquals( 2, results.size() );
final Employee employee1 = makeEmployee( employee1Id, "Employee1", company1Id, "COMPANY1" );
final Employee employee2 = makeEmployee( employee2Id, "Employee2", company1Id, "COMPANY1" );
assertThat( results.contains( employee1 ), is(true) );
assertThat( results.contains( employee2 ), is(true) );
}
@Test
public void testCompany2EmployeeIn() {
AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity( Employee.class, true, true );
auditQuery.add( AuditEntity.relatedId( "company" ).in( new Integer[]{ company2Id } ) );
final List<Employee> results = auditQuery.getResultList();
assertEquals( 2, results.size() );
final Employee employee1 = makeEmployee( employee2Id, "Employee2", company2Id, "COMPANY2" );
final Employee employee2 = makeEmployee( employee3Id, "Employee3", company2Id, "COMPANY2" );
assertThat( results.contains( employee1 ), is(true) );
assertThat( results.contains( employee2 ), is(true) );
}
@Test
public void testCompany3EmployeeIn() {
AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity( Employee.class, true, true );
auditQuery.add( AuditEntity.relatedId( "company" ).in( new Integer[]{ company3Id } ) );
final List<Employee> results = auditQuery.getResultList();
assertEquals( 1, results.size() );
final Employee employee = makeEmployee( employee4Id, "Employee4", company3Id, "COMPANY3" );
assertEquals( results, TestTools.makeList( employee ) );
}
private Employee makeEmployee(Integer employeeId, String employeeName, Integer companyId, String companyName) {
return new Employee( employeeId, employeeName, new Company( companyId, companyName ) );
}
}