一尘不染

休眠:一对一延迟加载,可选= false

hibernate

我遇到了 一个 问题,即 一对一的延迟加载 在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关系,则延迟加载 效果很好

@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
private Adress address;

问题/完整性: 请向我解释optional=false注释如何帮助实现延迟加载。

PS 我已经阅读了post1post2的帖子,并了解了为什么简单的OneToOne不能偷懒,但是我仍然无法掌握optional=false魔术。


阅读 227

收藏
2020-06-20

共1个答案

一尘不染

如果关联是可选的,则Hibernate无法在不发出查询的情况下知道给定人员的地址是否存在。因此,它不能使用代理填充地址字段,因为可能没有引用该人的地址,并且不能填充null,因为可能存在引用该人的地址。

当您使关联成为强制性(即optional=false)时,它会信任您并假定一个地址存在,因为关联是强制性的。因此,在知道有引用该人的地址的情况下,它直接用代理填充地址字段。

2020-06-20