Skip to content

Commit fe89b0b

Browse files
JBodkindreab8
authored andcommitted
HHH-16766: Load lazy hierarchical IdClass entities
1 parent 91b17b8 commit fe89b0b

File tree

10 files changed

+637
-1
lines changed

10 files changed

+637
-1
lines changed

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ private boolean handleIdType(EntityPersister persister, LoadEvent event, LoadTyp
146146
return false;
147147
}
148148
else {
149-
return true;
149+
return !idClass.isInstance( event.getEntityId() );
150150
}
151151
}
152152
else {

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/NonAggregatedIdentifierMappingImpl.java

+6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping;
2727
import org.hibernate.metamodel.mapping.SelectableMappings;
2828
import org.hibernate.persister.entity.EntityPersister;
29+
import org.hibernate.proxy.HibernateProxy;
30+
import org.hibernate.proxy.LazyInitializer;
2931
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
3032
import org.hibernate.spi.NavigablePath;
3133
import org.hibernate.sql.ast.Clause;
@@ -218,6 +220,10 @@ public String getAttributeName() {
218220
@Override
219221
public Object getIdentifier(Object entity) {
220222
if ( hasContainingClass() ) {
223+
final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( entity );
224+
if ( lazyInitializer != null ) {
225+
return lazyInitializer.getIdentifier();
226+
}
221227
final Object id = identifierValueMapper.getRepresentationStrategy().getInstantiator().instantiate(
222228
null,
223229
sessionFactory
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.hibernate.orm.test.annotations.cid;
2+
3+
import jakarta.persistence.*;
4+
5+
import java.util.List;
6+
7+
@Entity
8+
@Table(name = "flight")
9+
public class Flight {
10+
11+
@Id
12+
@Column(name = "id")
13+
private Integer id;
14+
15+
@OneToMany(mappedBy = "flight", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
16+
private List<FlightSegment> segments;
17+
18+
public Integer getId() {
19+
return id;
20+
}
21+
22+
public void setId(Integer id) {
23+
this.id = id;
24+
}
25+
26+
public List<FlightSegment> getSegments() {
27+
return segments;
28+
}
29+
30+
public void setSegments(List<FlightSegment> segments) {
31+
this.segments = segments;
32+
}
33+
34+
public void addSegment(FlightSegment segment) {
35+
segment.setFlight(this);
36+
segments.add(segment);
37+
}
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.hibernate.orm.test.annotations.cid;
2+
3+
import jakarta.persistence.*;
4+
5+
@Entity
6+
@IdClass(FlightSegmentId.class)
7+
@Table(name = "flight_segment")
8+
public class FlightSegment {
9+
10+
@Id
11+
@ManyToOne(fetch = FetchType.LAZY)
12+
@JoinColumn(name = "flight_id", nullable = false)
13+
private Flight flight;
14+
15+
@Id
16+
@Column(name = "segment_number")
17+
private Integer segmentNumber;
18+
19+
@OneToOne(mappedBy = "segment", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
20+
private FlightSegmentConfiguration configuration;
21+
22+
public Flight getFlight() {
23+
return flight;
24+
}
25+
26+
public void setFlight(Flight flight) {
27+
this.flight = flight;
28+
}
29+
30+
public Integer getSegmentNumber() {
31+
return segmentNumber;
32+
}
33+
34+
public void setSegmentNumber(Integer segmentNumber) {
35+
this.segmentNumber = segmentNumber;
36+
}
37+
38+
public FlightSegmentConfiguration getConfiguration() {
39+
return configuration;
40+
}
41+
42+
public void setConfiguration(FlightSegmentConfiguration configuration) {
43+
configuration.setSegment(this);
44+
this.configuration = configuration;
45+
}
46+
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.hibernate.orm.test.annotations.cid;
2+
3+
import jakarta.persistence.*;
4+
5+
@Entity
6+
@IdClass(FlightSegmentConfigurationId.class)
7+
@Table(name = "flight_segment_configuration")
8+
public class FlightSegmentConfiguration {
9+
10+
@Id
11+
@OneToOne(fetch = FetchType.LAZY)
12+
@JoinColumn(name = "flight_id", referencedColumnName = "flight_id", nullable = false)
13+
@JoinColumn(name = "segment_number", referencedColumnName = "segment_number", nullable = false)
14+
private FlightSegment segment;
15+
16+
public FlightSegment getSegment() {
17+
return segment;
18+
}
19+
20+
public void setSegment(FlightSegment segment) {
21+
this.segment = segment;
22+
}
23+
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.hibernate.orm.test.annotations.cid;
2+
3+
import java.io.Serializable;
4+
import java.util.Objects;
5+
import java.util.StringJoiner;
6+
7+
public class FlightSegmentConfigurationId implements Serializable {
8+
9+
private FlightSegmentId segment;
10+
11+
public FlightSegmentConfigurationId() {
12+
}
13+
14+
public FlightSegmentConfigurationId(FlightSegmentId segment) {
15+
this.segment = segment;
16+
}
17+
18+
public FlightSegmentId getSegment() {
19+
return segment;
20+
}
21+
22+
public void setSegment(FlightSegmentId segment) {
23+
this.segment = segment;
24+
}
25+
26+
@Override
27+
public boolean equals(Object o) {
28+
if (this == o) return true;
29+
if (o == null || getClass() != o.getClass()) return false;
30+
FlightSegmentConfigurationId that = (FlightSegmentConfigurationId) o;
31+
return Objects.equals(segment, that.segment);
32+
}
33+
34+
@Override
35+
public int hashCode() {
36+
return Objects.hash(segment);
37+
}
38+
39+
@Override
40+
public String toString() {
41+
return new StringJoiner(", ", FlightSegmentConfigurationId.class.getSimpleName() + "[", "]")
42+
.add("segment=" + segment)
43+
.toString();
44+
}
45+
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.hibernate.orm.test.annotations.cid;
2+
3+
import java.io.Serializable;
4+
import java.util.Objects;
5+
import java.util.StringJoiner;
6+
7+
public class FlightSegmentId implements Serializable {
8+
9+
private Integer flight;
10+
private Integer segmentNumber;
11+
12+
public FlightSegmentId() {
13+
}
14+
15+
public FlightSegmentId(Integer flight, Integer segmentNumber) {
16+
this.flight = flight;
17+
this.segmentNumber = segmentNumber;
18+
}
19+
20+
public Integer getFlight() {
21+
return flight;
22+
}
23+
24+
public void setFlight(Integer flight) {
25+
this.flight = flight;
26+
}
27+
28+
public Integer getSegmentNumber() {
29+
return segmentNumber;
30+
}
31+
32+
public void setSegmentNumber(Integer segmentNumber) {
33+
this.segmentNumber = segmentNumber;
34+
}
35+
36+
@Override
37+
public boolean equals(Object o) {
38+
if (this == o) return true;
39+
if (o == null || getClass() != o.getClass()) return false;
40+
FlightSegmentId that = (FlightSegmentId) o;
41+
return Objects.equals(flight, that.flight) && Objects.equals(segmentNumber, that.segmentNumber);
42+
}
43+
44+
@Override
45+
public int hashCode() {
46+
return Objects.hash(flight, segmentNumber);
47+
}
48+
49+
@Override
50+
public String toString() {
51+
return new StringJoiner(", ", FlightSegmentId.class.getSimpleName() + "[", "]")
52+
.add("flight=" + flight)
53+
.add("segmentNumber=" + segmentNumber)
54+
.toString();
55+
}
56+
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.hibernate.orm.test.annotations.cid;
2+
3+
import jakarta.persistence.*;
4+
5+
@Entity
6+
@Table(name = "freight")
7+
public class Freight {
8+
9+
@Id
10+
@Column(name = "freight_number")
11+
private Integer freightNumber;
12+
13+
@ManyToOne(fetch = FetchType.LAZY)
14+
@JoinColumn(name = "flight_id", referencedColumnName = "flight_id")
15+
@JoinColumn(name = "segment_number", referencedColumnName = "segment_number")
16+
private FlightSegment flightSegment;
17+
18+
public Integer getFreightNumber() {
19+
return freightNumber;
20+
}
21+
22+
public void setFreightNumber(Integer freightNumber) {
23+
this.freightNumber = freightNumber;
24+
}
25+
26+
public FlightSegment getFlightSegment() {
27+
return flightSegment;
28+
}
29+
30+
public void setFlightSegment(FlightSegment flightSegment) {
31+
this.flightSegment = flightSegment;
32+
}
33+
34+
}

0 commit comments

Comments
 (0)