I’m currently in the process of migrating a Spring Boot application from Hibernate 5.x to Hibernate 6.x, and I’m getting a stack overflow error with bidirectional entity mappings that were previously working fine.
@Entity
public class Sponsor {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@Type(type = "pg-uuid")
@Column(name = Properties.UUID, unique = true, nullable = false)
protected UUID uuid;
/**
* If the sponsor is the official sponsor for an event, then this field will point
* to the event. Otherwise, only the sponsor's relatedEvents will be set.
*/
@OneToOne(mappedBy = Event.Properties.SPONSOR, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Event officialEvent;
/**
* This points to the related event. However, an event could have multiple sponsors all
* claiming to represent the event. The official sponsor will have both the event field
* as well as the relatedEvent field set.
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "event_uuid")
private Event relatedEvent;
// other fields, getters, setters
}
@Entity
public class Event {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@Type(type = "pg-uuid")
@Column(name = Properties.UUID, unique = true, nullable = false)
protected UUID uuid;
/**
* This points to the official sponsor. However, MULTIPLE sponsors can sometimes
* claim to represent the event. The relatedSponsors field below links to all related
* sponsors not just the official sponsor represented here.
*/
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "sponsor_uuid")
private Sponsor sponsor;
/**
* This points to ALL sponsor claiming a sponsorship with the event.
*/
@OneToMany(mappedBy = "relatedEvent", targetEntity = Sponsor.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Sponsor> relatedSponsors = new ArrayList<Sponsor>();
Error:
java.lang.StackOverflowError: null
at org.hibernate.sql.results.graph.entity.EntityResultGraphNode.getReferencedMappingContainer(EntityResultGraphNode.java:42)
at org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl.lambda$createAssembler$0(EntityFetchSelectImpl.java:73)
at org.hibernate.sql.results.internal.ResultsHelper$1.resolveInitializer(ResultsHelper.java:118)
at org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl.createAssembler(EntityFetchSelectImpl.java:67)
at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.<init>(AbstractEntityInitializer.java:176)
at org.hibernate.sql.results.graph.entity.internal.EntityResultInitializer.<init>(EntityResultInitializer.java:35)
at org.hibernate.sql.results.graph.entity.internal.EntityResultImpl.lambda$createResultAssembler$0(EntityResultImpl.java:91)
at org.hibernate.sql.results.internal.ResultsHelper$1.resolveInitializer(ResultsHelper.java:118)
at org.hibernate.sql.results.graph.entity.internal.EntityResultImpl.createResultAssembler(EntityResultImpl.java:82)
at org.hibernate.sql.results.jdbc.internal.StandardJdbcValuesMapping.resolveAssemblers(StandardJdbcValuesMapping.java:53)
at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:77)
at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:62)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:188)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:83)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:76)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:65)
at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:145)
at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:117)
at org.hibernate.loader.ast.internal.SingleIdEntityLoaderStandardImpl.load(SingleIdEntityLoaderStandardImpl.java:75)
at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:3748)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3737)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:604)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromCacheOrDatasource(DefaultLoadEventListener.java:590)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:560)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:544)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:207)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:106)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:68)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:138)
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1222)
at org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:1041)
....