package com.ankurm.hibernatedemo.association; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; /** * Non-owning ("mappedBy") side of an optional {@code @OneToOne}. Docs: 12-association-mappings.md, * chapter "The @OneToOne lazy trap". Even though {@link #profile} is declared * {@code FetchType.LAZY}, Hibernate cannot build a proxy for it here without bytecode * enhancement: it does not hold the foreign key, so it cannot know whether a profile row * exists without querying. The result is an eager extra SELECT on every load of LazyUser. */ @Entity @Table(name = "lazy_user") public class LazyUser { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; @OneToOne(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true) private LazyProfile profile; protected LazyUser() { } public LazyUser(String username) { this.username = username; } public Long getId() { return id; } public LazyProfile getProfile() { return profile; } public void setProfile(LazyProfile profile) { this.profile = profile; } }