/* * 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.embeddables; import java.util.List; import javax.persistence.EntityManager; import org.hibernate.envers.exception.AuditException; 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.testing.TestForIssue; import org.junit.Test; import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; import static org.junit.Assert.assertEquals; /** * Test which supports using {@link AuditEntity} to test equality/inequality * between embeddable components. * * @author Chris Cranford */ @TestForIssue(jiraKey = "HHH-9178") public class EmbeddableQuery extends BaseEnversJPAFunctionalTestCase { private Integer personId; @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { Person.class, NameInfo.class }; } @Test @Priority(10) public void initData() { EntityManager em = getOrCreateEntityManager(); try { // Revision 1 em.getTransaction().begin(); NameInfo ni = new NameInfo( "John", "Doe" ); Person person1 = new Person( "JDOE", ni ); em.persist( person1 ); em.getTransaction().commit(); // Revision 2 em.getTransaction().begin(); person1 = em.find( Person.class, person1.getId() ); person1.getNameInfo().setFirstName( "Jane" ); em.merge( person1 ); em.getTransaction().commit(); // Revision 3 em.getTransaction().begin(); person1 = em.find( Person.class, person1.getId() ); person1.setName( "JDOE2" ); em.merge( person1 ); em.getTransaction().commit(); personId = person1.getId(); } finally { em.close(); } } @Test public void testRevisionCounts() { assertEquals( 3, getAuditReader().getRevisions( Person.class, personId ).size() ); } @Test public void testAuditQueryUsingEmbeddableEquals() { final NameInfo nameInfo = new NameInfo( "John", "Doe" ); final AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision( Person.class, 1 ); query.add( AuditEntity.property( "nameInfo" ).eq( nameInfo ) ); List<?> results = query.getResultList(); assertEquals( 1, results.size() ); final Person person = (Person) results.get( 0 ); assertEquals( nameInfo, person.getNameInfo() ); } @Test public void testAuditQueryUsingEmbeddableNotEquals() { final NameInfo nameInfo = new NameInfo( "Jane", "Doe" ); final AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision( Person.class, 1 ); query.add( AuditEntity.property( "nameInfo" ).ne( nameInfo ) ); assertEquals( 0, query.getResultList().size() ); } @Test public void testAuditQueryUsingEmbeddableNonEqualityCheck() { try { final NameInfo nameInfo = new NameInfo( "John", "Doe" ); final AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision( Person.class, 1 ); query.add( AuditEntity.property( "nameInfo" ).le( nameInfo ) ); } catch ( Exception ex ) { assertTyping( AuditException.class, ex ); } } }