HHH-11770 - Added test case.
This commit is contained in:
parent
77ea6186f7
commit
10e69bd7b2
|
@ -0,0 +1,342 @@
|
|||
/*
|
||||
* 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.embeddedid;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.persistence.AssociationOverride;
|
||||
import javax.persistence.AssociationOverrides;
|
||||
import javax.persistence.Basic;
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.EmbeddedId;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Transient;
|
||||
|
||||
import org.hibernate.annotations.Fetch;
|
||||
import org.hibernate.annotations.FetchMode;
|
||||
import org.hibernate.envers.AuditReader;
|
||||
import org.hibernate.envers.Audited;
|
||||
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue(jiraKey = "HHH-11770")
|
||||
public class OneToManyCompositeKeyTest extends BaseEnversJPAFunctionalTestCase {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[]{ Contract.class, Design.class, DesignContract.class };
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initData() {
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
final Contract contract = new Contract( 1 );
|
||||
final Design design = new Design( 1 );
|
||||
final DesignContract designContract = new DesignContract( contract, design );
|
||||
designContract.setGoal( 25d );
|
||||
contract.getDesigns().add( designContract );
|
||||
entityManager.persist( design );
|
||||
entityManager.persist( contract );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRevisionCounts() {
|
||||
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Contract.class, 1 ) );
|
||||
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Design.class, 1 ) );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneToManyAssociationAuditQuery() {
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
final AuditReader auditReader = getAuditReader();
|
||||
final Contract contract = auditReader.find( Contract.class, 1, 1 );
|
||||
final Design design = auditReader.find( Design.class, 1, 1 );
|
||||
assertEquals( 1, contract.getDesigns().size() );
|
||||
|
||||
final DesignContract designContract = contract.getDesigns().iterator().next();
|
||||
assertEquals( contract.getId(), designContract.getContract().getId() );
|
||||
assertEquals( design.getId(), designContract.getDesign().getId() );
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity(name = "Contract")
|
||||
@Table(name = "CONTRACTS")
|
||||
@Audited
|
||||
public static class Contract {
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@OneToMany(mappedBy = "pk.contract", fetch = FetchType.EAGER, cascade = { CascadeType.ALL } )
|
||||
@Fetch(value = FetchMode.SUBSELECT)
|
||||
private List<DesignContract> designs = new ArrayList<>();
|
||||
|
||||
Contract() {
|
||||
|
||||
}
|
||||
|
||||
Contract(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public List<DesignContract> getDesigns() {
|
||||
return designs;
|
||||
}
|
||||
|
||||
public void setDesigns(List<DesignContract> designs) {
|
||||
this.designs = designs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Contract contract = (Contract) o;
|
||||
|
||||
return id != null ? id.equals( contract.id ) : contract.id == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id != null ? id.hashCode() : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Contract{" +
|
||||
"id=" + id +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "DesignContract")
|
||||
@AssociationOverrides(value = {
|
||||
@AssociationOverride(name = "pk.contract", joinColumns = @JoinColumn(name = "FK_CONTRACT")),
|
||||
@AssociationOverride(name = "pk.design", joinColumns = @JoinColumn(name = "FK_DESIGN"))
|
||||
})
|
||||
@Table(name = "CONTRACT_DESIGNS")
|
||||
@Audited
|
||||
public static class DesignContract {
|
||||
@EmbeddedId
|
||||
private DesignContractId pk = new DesignContractId();
|
||||
@Basic
|
||||
@Column(name = "GOAL", nullable = false, precision = 5, scale = 2)
|
||||
private Double goal;
|
||||
|
||||
DesignContract() {
|
||||
|
||||
}
|
||||
|
||||
DesignContract(Contract contract, Design design) {
|
||||
pk.setContract( contract );
|
||||
pk.setDesign( design );
|
||||
}
|
||||
|
||||
public DesignContractId getPk() {
|
||||
return pk;
|
||||
}
|
||||
|
||||
public void setPk(DesignContractId pk) {
|
||||
this.pk = pk;
|
||||
}
|
||||
|
||||
@Transient
|
||||
public Contract getContract() {
|
||||
return pk.getContract();
|
||||
}
|
||||
|
||||
@Transient
|
||||
public Design getDesign() {
|
||||
return pk.getDesign();
|
||||
}
|
||||
|
||||
public Double getGoal() {
|
||||
return goal;
|
||||
}
|
||||
|
||||
public void setGoal(Double goal) {
|
||||
this.goal = goal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
DesignContract that = (DesignContract) o;
|
||||
|
||||
if ( pk != null ? !pk.equals( that.pk ) : that.pk != null ) {
|
||||
return false;
|
||||
}
|
||||
return goal != null ? goal.equals( that.goal ) : that.goal == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = pk != null ? pk.hashCode() : 0;
|
||||
result = 31 * result + ( goal != null ? goal.hashCode() : 0 );
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "DesignContract{" +
|
||||
"pk=" + pk +
|
||||
", goal=" + goal +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
public static class DesignContractId implements Serializable {
|
||||
@ManyToOne
|
||||
private Contract contract;
|
||||
@ManyToOne
|
||||
private Design design;
|
||||
|
||||
DesignContractId() {
|
||||
|
||||
}
|
||||
|
||||
DesignContractId(Contract contract, Design design) {
|
||||
this.contract = contract;
|
||||
this.design = design;
|
||||
}
|
||||
|
||||
public Contract getContract() {
|
||||
return contract;
|
||||
}
|
||||
|
||||
public void setContract(Contract contract) {
|
||||
this.contract = contract;
|
||||
}
|
||||
|
||||
public Design getDesign() {
|
||||
return design;
|
||||
}
|
||||
|
||||
public void setDesign(Design design) {
|
||||
this.design = design;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
DesignContractId that = (DesignContractId) o;
|
||||
|
||||
if ( contract != null ? !contract.equals( that.contract ) : that.contract != null ) {
|
||||
return false;
|
||||
}
|
||||
return design != null ? design.equals( that.design ) : that.design == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = contract != null ? contract.hashCode() : 0;
|
||||
result = 31 * result + ( design != null ? design.hashCode() : 0 );
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "DesignContractId{" +
|
||||
"contract=" + contract +
|
||||
", design=" + design +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "Design")
|
||||
@Audited
|
||||
private static class Design {
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
Design() {
|
||||
|
||||
}
|
||||
|
||||
Design(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Design design = (Design) o;
|
||||
|
||||
return id != null ? id.equals( design.id ) : design.id == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id != null ? id.hashCode() : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Design{" +
|
||||
"id=" + id +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue