为什么懒惰加载不能在一对一关联中工作?

@Entity public class Person { @Id @GeneratedValue private int personId; @OneToOne(cascade=CascadeType.ALL, mappedBy="person", fetch=FetchType.LAZY) private PersonDetail personDetail; //getters and setters } @Entity public class PersonDetail { @Id @GeneratedValue private int personDetailId; @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) private Person person; //getters and setters } 

当我做

  Person person1=(Person)session.get(Person.class, 1); 

我看到两个查询被解雇了。 一个用于获取人员数据,另一个用于获取人员详细数据。

根据我的理解,应该只触发1个查询,用于获取人员数据而不是人员详细数据,因为我已经提到了延迟加载。 为什么personDetail数据与人员数据一起被提取?

Hibernate不能像@ToMany关系中的集合/列表一样代理您自己的对象,因此延迟加载不起作用。

我认为这个链接可能有助于理解您的问题: http : //justonjava.blogspot.co.uk/2010/09/lazy-one-to-one-and-one-to-many.html

根据您的注释,由于PersonDetail实体包含引用Person实体的外键列,因此您看起来只有1个问题:

实体关系包括关系所有者的概念(在本例中为PersonDetail ),这意味着您要在PersonDetail实体中添加@JoinColumn注释。

您已经使用添加到关联注释(在您的情况下为@OneToOne )中的mappedBy属性正确定义了关系的反面(不是关系所有者的实体),以使关系成为双向关系,表示可以从Person实例访问关联的PersonDetail

鉴于您的评论中阐明的关系,您只需对代码进行1次更改,如下所示:

 @Entity public class Person { @Id @GeneratedValue private int personId; //Retain the mappedBy attribute here: @OneToOne(cascade=CascadeType.ALL, mappedBy="person", fetch=FetchType.LAZY) private PersonDetail personDetail; //getters and setters... } @Entity public class PersonDetail { @Id @GeneratedValue private int personDetailId; @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY) //Change: add the @JoinColumn annotation here: @JoinColumn(name="PERSON_FK_COLUMN") private Person person; //getters and setters... }