HHH-16901 Add test for issue

This commit is contained in:
Marco Belladelli 2023-07-10 11:38:26 +02:00 committed by Christian Beikov
parent 424c6b447f
commit 7cb00f3521
1 changed files with 231 additions and 0 deletions

View File

@ -0,0 +1,231 @@
/*
* 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.orm.test.mapping.embeddable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import jakarta.persistence.AssociationOverride;
import jakarta.persistence.AttributeOverride;
import jakarta.persistence.AttributeOverrides;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Embedded;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import static jakarta.persistence.CascadeType.ALL;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Marco Belladelli
*/
@SessionFactory
@DomainModel( annotatedClasses = {
NestedAssociationEmbeddableTest.Location.class,
NestedAssociationEmbeddableTest.Poi.class,
NestedAssociationEmbeddableTest.Report.class,
NestedAssociationEmbeddableTest.ReportTripId.class,
NestedAssociationEmbeddableTest.ReportTrip.class,
NestedAssociationEmbeddableTest.Trip.class,
} )
public class NestedAssociationEmbeddableTest {
@BeforeAll
public void setUp(SessionFactoryScope scope) {
scope.inTransaction( session -> {
final Poi poi = new Poi( 1L, "poi_1" );
session.persist( poi );
final Trip trip = new Trip( 2L, new Location( 1, poi ), new Location( 2, null ) );
session.persist( trip );
final Report report = new Report( 3L );
report.getReportTripList().add( new ReportTrip( new ReportTripId( report, trip ), "other" ) );
session.persist( report );
} );
}
@Test
public void testFindTrip(SessionFactoryScope scope) {
scope.inTransaction( session -> {
final Trip trip = session.find( Trip.class, 2L );
assertThat( trip.getPosition1() ).isNotNull();
assertThat( trip.getPosition1().getDistance() ).isEqualTo( 1 );
assertThat( trip.getPosition1().getPoi().getName() ).isEqualTo( "poi_1" );
assertThat( trip.getPosition2() ).isNotNull();
assertThat( trip.getPosition2().getDistance() ).isEqualTo( 2 );
assertThat( trip.getPosition2().getPoi() ).isNull();
} );
}
@Test
public void testFindReport(SessionFactoryScope scope) {
scope.inTransaction( session -> {
final Report report = session.find( Report.class, 3L );
final ReportTrip reportTrip = report.getReportTripList().get( 0 );
assertThat( reportTrip.getCompositeKey().getTrip().getPosition1() ).isNotNull();
assertThat( reportTrip.getCompositeKey().getTrip().getPosition1().getDistance() ).isEqualTo( 1 );
assertThat( reportTrip.getCompositeKey().getTrip().getPosition1().getPoi().getName() ).isEqualTo( "poi_1" );
assertThat( reportTrip.getCompositeKey().getTrip().getPosition2() ).isNotNull();
assertThat( reportTrip.getCompositeKey().getTrip().getPosition2().getDistance() ).isEqualTo( 2 );
assertThat( reportTrip.getCompositeKey().getTrip().getPosition2().getPoi() ).isNull();
} );
}
@Embeddable
public static class Location {
private Integer distance;
@ManyToOne
private Poi poi;
public Location() {
}
public Location(Integer distance, Poi poi) {
this.distance = distance;
this.poi = poi;
}
public Integer getDistance() {
return distance;
}
public Poi getPoi() {
return poi;
}
}
@Entity( name = "Poi" )
public static class Poi {
@Id
private Long id;
private String name;
public Poi() {
}
public Poi(Long id, String name) {
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
}
@Entity( name = "Report" )
public static class Report {
@Id
private Long id;
@OneToMany( mappedBy = "compositeKey.report", cascade = ALL, orphanRemoval = true, fetch = FetchType.EAGER )
private List<ReportTrip> reportTripList = new ArrayList<>();
public Report() {
}
public Report(Long id) {
this.id = id;
}
public List<ReportTrip> getReportTripList() {
return reportTripList;
}
}
@Embeddable
public static class ReportTripId implements Serializable {
@ManyToOne
@JoinColumn( name = "report_id_fk" )
private Report report;
@ManyToOne
@JoinColumn( name = "trip_id_fk" )
private Trip trip;
public ReportTripId() {
}
public ReportTripId(Report report, Trip trip) {
this.report = report;
this.trip = trip;
}
public Trip getTrip() {
return trip;
}
}
@Entity( name = "ReportTrip" )
public static class ReportTrip {
@EmbeddedId
private ReportTripId compositeKey = new ReportTripId();
private String other;
public ReportTrip() {
}
public ReportTrip(ReportTripId compositeKey, String other) {
this.compositeKey = compositeKey;
this.other = other;
}
public ReportTripId getCompositeKey() {
return compositeKey;
}
}
@Entity( name = "Trip" )
public static class Trip {
@Id
private Long id;
@Embedded
@AttributeOverrides( {
@AttributeOverride( name = "distance", column = @Column( name = "distance_1" ) ),
} )
@AssociationOverride( name = "poi", joinColumns = @JoinColumn( name = "poi_id_1" ) )
private Location position1 = new Location();
@Embedded
@AttributeOverrides( {
@AttributeOverride( name = "distance", column = @Column( name = "distance_2" ) ),
} )
@AssociationOverride( name = "poi", joinColumns = @JoinColumn( name = "poi_id_2" ) )
private Location position2 = new Location();
public Trip() {
}
public Trip(Long id, Location position1, Location position2) {
this.id = id;
this.position1 = position1;
this.position2 = position2;
}
public Location getPosition1() {
return position1;
}
public Location getPosition2() {
return position2;
}
}
}