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