为什么延迟加载在一对一关联中不起作用?


@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 数据与人员数据一起获取?

休眠不能像@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...
}

最新更新