HHH-11748 - Added test cases
This commit is contained in:
parent
9a22960c3e
commit
ac15d45da2
|
@ -0,0 +1,270 @@
|
||||||
|
/*
|
||||||
|
* 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.ids;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.EmbeddedId;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
import org.hibernate.envers.Audited;
|
||||||
|
import org.hibernate.envers.RevisionType;
|
||||||
|
import org.hibernate.envers.query.AuditEntity;
|
||||||
|
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||||
|
import org.hibernate.envers.test.Priority;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.transaction.TransactionUtil;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-11748")
|
||||||
|
public class EmbeddedIdRelatedIdQueryTest extends BaseEnversJPAFunctionalTestCase {
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[] { Person.class, Document.class, PersonDocument.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(10)
|
||||||
|
public void initData() {
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = new Person( 1, "Chris" );
|
||||||
|
final Document document = new Document( 1, "DL" );
|
||||||
|
final PersonDocument pd = new PersonDocument( person, document );
|
||||||
|
entityManager.persist( person );
|
||||||
|
entityManager.persist( document );
|
||||||
|
entityManager.persist( pd );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = entityManager.find( Person.class, 1 );
|
||||||
|
final Document document = new Document( 2, "Passport" );
|
||||||
|
final PersonDocument pd = new PersonDocument( person, document );
|
||||||
|
entityManager.persist( document );
|
||||||
|
entityManager.persist( pd );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = entityManager.find( Person.class, 1 );
|
||||||
|
final Document document = entityManager.find( Document.class, 1 );
|
||||||
|
final PersonDocument pd = entityManager
|
||||||
|
.createQuery( "FROM PersonDocument WHERE id.person.id = :person AND id.document.id = :document", PersonDocument.class )
|
||||||
|
.setParameter( "person", person.getId() )
|
||||||
|
.setParameter( "document", document.getId() )
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
entityManager.remove( pd );
|
||||||
|
entityManager.remove( document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRevisionCounts() {
|
||||||
|
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Person.class, 1 ) );
|
||||||
|
assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( Document.class, 1 ) );
|
||||||
|
assertEquals( Arrays.asList( 2 ), getAuditReader().getRevisions( Document.class, 2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRelatedIdQueries() {
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "id.person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 1 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getId().getDocument();
|
||||||
|
assertEquals( "DL", document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "id.person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 2 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getId().getDocument();
|
||||||
|
assertEquals( "Passport", document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "id.person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 3 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getId().getDocument();
|
||||||
|
assertNull( document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "id.document" ).eq( 1 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 2, results.size() );
|
||||||
|
for ( Object result : results ) {
|
||||||
|
Object[] row = (Object[]) result;
|
||||||
|
final RevisionType revisionType = (RevisionType) row[2];
|
||||||
|
final Document document = ( (PersonDocument) row[0] ).getId().getDocument();
|
||||||
|
if ( RevisionType.ADD.equals( revisionType ) ) {
|
||||||
|
assertEquals( "DL", document.getName() );
|
||||||
|
}
|
||||||
|
else if ( RevisionType.DEL.equals( revisionType ) ) {
|
||||||
|
assertNull( document.getName() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "id.document" ).eq( 2 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
for ( Object result : results ) {
|
||||||
|
Object[] row = (Object[]) result;
|
||||||
|
final RevisionType revisionType = (RevisionType) row[2];
|
||||||
|
final Document document = ( (PersonDocument) row[0] ).getId().getDocument();
|
||||||
|
assertEquals( RevisionType.ADD, revisionType );
|
||||||
|
assertEquals( "Passport", document.getName() );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public static class PersonDocumentId implements Serializable {
|
||||||
|
@ManyToOne(optional = false)
|
||||||
|
private Document document;
|
||||||
|
|
||||||
|
@ManyToOne(optional = false)
|
||||||
|
private Person person;
|
||||||
|
|
||||||
|
PersonDocumentId() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PersonDocumentId(Person person, Document document) {
|
||||||
|
this.person = person;
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocument(Document document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Person getPerson() {
|
||||||
|
return person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPerson(Person person) {
|
||||||
|
this.person = person;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "PersonDocument")
|
||||||
|
public static class PersonDocument implements Serializable {
|
||||||
|
@EmbeddedId
|
||||||
|
private PersonDocumentId id;
|
||||||
|
|
||||||
|
PersonDocument() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PersonDocument(Person person, Document document) {
|
||||||
|
this.id = new PersonDocumentId( person, document );
|
||||||
|
}
|
||||||
|
|
||||||
|
public PersonDocumentId getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(PersonDocumentId id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "Document")
|
||||||
|
public static class Document {
|
||||||
|
@Id
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Document() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Document(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Person")
|
||||||
|
@Audited
|
||||||
|
public static class Person {
|
||||||
|
@Id
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Person() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Person(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,271 @@
|
||||||
|
/*
|
||||||
|
* 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.ids;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.IdClass;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
import org.hibernate.envers.Audited;
|
||||||
|
import org.hibernate.envers.RevisionType;
|
||||||
|
import org.hibernate.envers.query.AuditEntity;
|
||||||
|
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||||
|
import org.hibernate.envers.test.Priority;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.transaction.TransactionUtil;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-11748")
|
||||||
|
public class IdClassRelatedIdQueryTest extends BaseEnversJPAFunctionalTestCase {
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[] { Person.class, Document.class, PersonDocument.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(10)
|
||||||
|
public void initData() {
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = new Person( 1, "Chris" );
|
||||||
|
final Document document = new Document( 1, "DL" );
|
||||||
|
final PersonDocument pd = new PersonDocument( person, document );
|
||||||
|
entityManager.persist( person );
|
||||||
|
entityManager.persist( document );
|
||||||
|
entityManager.persist( pd );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = entityManager.find( Person.class, 1 );
|
||||||
|
final Document document = new Document( 2, "Passport" );
|
||||||
|
final PersonDocument pd = new PersonDocument( person, document );
|
||||||
|
entityManager.persist( document );
|
||||||
|
entityManager.persist( pd );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = entityManager.find( Person.class, 1 );
|
||||||
|
final Document document = entityManager.find( Document.class, 1 );
|
||||||
|
final PersonDocument pd = entityManager
|
||||||
|
.createQuery( "FROM PersonDocument WHERE person.id = :person AND document.id = :document", PersonDocument.class )
|
||||||
|
.setParameter( "person", person.getId() )
|
||||||
|
.setParameter( "document", document.getId() )
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
entityManager.remove( pd );
|
||||||
|
entityManager.remove( document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRevisionCounts() {
|
||||||
|
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Person.class, 1 ) );
|
||||||
|
assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( Document.class, 1 ) );
|
||||||
|
assertEquals( Arrays.asList( 2 ), getAuditReader().getRevisions( Document.class, 2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRelatedIdQueries() {
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 1 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
|
||||||
|
assertEquals( "DL", document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 2 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
|
||||||
|
assertEquals( "Passport", document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 3 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
|
||||||
|
assertNull( document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "document" ).eq( 1 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 2, results.size() );
|
||||||
|
for ( Object result : results ) {
|
||||||
|
Object[] row = (Object[]) result;
|
||||||
|
final RevisionType revisionType = (RevisionType) row[2];
|
||||||
|
final Document document = ( (PersonDocument) row[0] ).getDocument();
|
||||||
|
if ( RevisionType.ADD.equals( revisionType ) ) {
|
||||||
|
assertEquals( "DL", document.getName() );
|
||||||
|
}
|
||||||
|
else if ( RevisionType.DEL.equals( revisionType ) ) {
|
||||||
|
assertNull( document.getName() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "document" ).eq( 2 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
for ( Object result : results ) {
|
||||||
|
Object[] row = (Object[]) result;
|
||||||
|
final RevisionType revisionType = (RevisionType) row[2];
|
||||||
|
final Document document = ( (PersonDocument) row[0] ).getDocument();
|
||||||
|
assertEquals( RevisionType.ADD, revisionType );
|
||||||
|
assertEquals( "Passport", document.getName() );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PersonDocumentId implements Serializable {
|
||||||
|
private Document document;
|
||||||
|
private Person person;
|
||||||
|
|
||||||
|
public Document getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocument(Document document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Person getPerson() {
|
||||||
|
return person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPerson(Person person) {
|
||||||
|
this.person = person;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "PersonDocument")
|
||||||
|
@IdClass( PersonDocumentId.class )
|
||||||
|
public static class PersonDocument implements Serializable {
|
||||||
|
@Id
|
||||||
|
@ManyToOne(optional = false)
|
||||||
|
private Document document;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@ManyToOne(optional = false)
|
||||||
|
private Person person;
|
||||||
|
|
||||||
|
PersonDocument() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PersonDocument(Person person, Document document) {
|
||||||
|
this.document = document;
|
||||||
|
this.person = person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocument(Document document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Person getPerson() {
|
||||||
|
return person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPerson(Person person) {
|
||||||
|
this.person = person;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "Document")
|
||||||
|
public static class Document {
|
||||||
|
@Id
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Document() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Document(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Person")
|
||||||
|
@Audited
|
||||||
|
public static class Person {
|
||||||
|
@Id
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Person() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Person(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,248 @@
|
||||||
|
/*
|
||||||
|
* 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.ids;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
import org.hibernate.envers.Audited;
|
||||||
|
import org.hibernate.envers.RevisionType;
|
||||||
|
import org.hibernate.envers.query.AuditEntity;
|
||||||
|
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||||
|
import org.hibernate.envers.test.Priority;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.transaction.TransactionUtil;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-11748")
|
||||||
|
public class MultipleIdRelatedIdQueryTest extends BaseEnversJPAFunctionalTestCase {
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[] { Person.class, Document.class, PersonDocument.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(10)
|
||||||
|
public void initData() {
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = new Person( 1, "Chris" );
|
||||||
|
final Document document = new Document( 1, "DL" );
|
||||||
|
final PersonDocument pd = new PersonDocument( person, document );
|
||||||
|
entityManager.persist( person );
|
||||||
|
entityManager.persist( document );
|
||||||
|
entityManager.persist( pd );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = entityManager.find( Person.class, 1 );
|
||||||
|
final Document document = new Document( 2, "Passport" );
|
||||||
|
final PersonDocument pd = new PersonDocument( person, document );
|
||||||
|
entityManager.persist( document );
|
||||||
|
entityManager.persist( pd );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
final Person person = entityManager.find( Person.class, 1 );
|
||||||
|
final Document document = entityManager.find( Document.class, 1 );
|
||||||
|
final PersonDocument pd = entityManager
|
||||||
|
.createQuery( "FROM PersonDocument WHERE person.id = :person AND document.id = :document", PersonDocument.class )
|
||||||
|
.setParameter( "person", person.getId() )
|
||||||
|
.setParameter( "document", document.getId() )
|
||||||
|
.getSingleResult();
|
||||||
|
|
||||||
|
entityManager.remove( pd );
|
||||||
|
entityManager.remove( document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRevisionCounts() {
|
||||||
|
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Person.class, 1 ) );
|
||||||
|
assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( Document.class, 1 ) );
|
||||||
|
assertEquals( Arrays.asList( 2 ), getAuditReader().getRevisions( Document.class, 2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRelatedIdQueries() {
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 1 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
|
||||||
|
assertEquals( "DL", document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 2 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
|
||||||
|
assertEquals( "Passport", document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
|
||||||
|
.add( AuditEntity.revisionNumber().eq( 3 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
|
||||||
|
assertNull( document.getName() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "document" ).eq( 1 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 2, results.size() );
|
||||||
|
for ( Object result : results ) {
|
||||||
|
Object[] row = (Object[]) result;
|
||||||
|
final RevisionType revisionType = (RevisionType) row[2];
|
||||||
|
final Document document = ( (PersonDocument) row[0] ).getDocument();
|
||||||
|
if ( RevisionType.ADD.equals( revisionType ) ) {
|
||||||
|
assertEquals( "DL", document.getName() );
|
||||||
|
}
|
||||||
|
else if ( RevisionType.DEL.equals( revisionType ) ) {
|
||||||
|
assertNull( document.getName() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
|
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
|
||||||
|
.add( AuditEntity.relatedId( "document" ).eq( 2 ) )
|
||||||
|
.getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
for ( Object result : results ) {
|
||||||
|
Object[] row = (Object[]) result;
|
||||||
|
final RevisionType revisionType = (RevisionType) row[2];
|
||||||
|
final Document document = ( (PersonDocument) row[0] ).getDocument();
|
||||||
|
assertEquals( RevisionType.ADD, revisionType );
|
||||||
|
assertEquals( "Passport", document.getName() );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "PersonDocument")
|
||||||
|
public static class PersonDocument implements Serializable {
|
||||||
|
@Id
|
||||||
|
@ManyToOne(optional = false)
|
||||||
|
private Document document;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@ManyToOne(optional = false)
|
||||||
|
private Person person;
|
||||||
|
|
||||||
|
PersonDocument() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PersonDocument(Person person, Document document) {
|
||||||
|
this.document = document;
|
||||||
|
this.person = person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocument(Document document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Person getPerson() {
|
||||||
|
return person;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPerson(Person person) {
|
||||||
|
this.person = person;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "Document")
|
||||||
|
public static class Document {
|
||||||
|
@Id
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Document() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Document(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Person")
|
||||||
|
@Audited
|
||||||
|
public static class Person {
|
||||||
|
@Id
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
Person() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Person(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue