我遇到了一个问题,即一对一的延迟加载无法在休眠状态下工作。我已经解决了它,但是仍然不正确 了解会发生什么。

我的代码(延迟加载在这里不起作用,当我提取Person时-也获取了地址):

@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;
}

:如果我在OneToOne关系中添加 optional=false ,则延迟加载可以很好地实现!
@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
private Adress address;

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

P.S. 我已经阅读了post1post2帖子,并理解了为什么简单的OneToOne不能偷懒,但是我仍然无法理解optional=false的魔力。

最佳答案

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

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

关于hibernate - hibernate :一对一延迟加载,可选= false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17987638/

10-10 00:25
查看更多