我遇到了 一个 问题,即 一对一的延迟加载 在hibernate状态下不起作用。我 已经解决了它 ,但仍然 无法 正确 理解 会发生什么。
我的代码( 延迟加载在这里不起作用 ,当我拉人时-地址也被获取):
@Entity public class Person{ @Id @SequenceGenerator(name = "person_sequence", sequenceName = "sq_person") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence") @Column(name = "id") private long personID; @OneToOne(mappedBy="person", cascade=CascadeType.ALL, fetch = FetchType.LAZY) private Adress address; //.. getters, setters } @Entity public class Address { @Id @Column(name="id", unique=true, nullable=false) @GeneratedValue(generator="gen") @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="person")) private long personID; @PrimaryKeyJoinColumn @OneToOne private FileInfo person; }
但是 :如果我添加 optional=false OneToOne关系,则延迟加载 效果很好 !
optional=false
@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY) private Adress address;
问题/完整性: 请向我解释optional=false注释如何帮助实现延迟加载。
PS 我已经阅读了post1和post2的帖子,并了解了为什么简单的OneToOne不能偷懒,但是我仍然无法掌握optional=false魔术。
如果关联是可选的,则Hibernate无法在不发出查询的情况下知道给定人员的地址是否存在。因此,它不能使用代理填充地址字段,因为可能没有引用该人的地址,并且不能填充null,因为可能存在引用该人的地址。
当您使关联成为强制性(即optional=false)时,它会信任您并假定一个地址存在,因为关联是强制性的。因此,在知道有引用该人的地址的情况下,它直接用代理填充地址字段。