@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数据与人员数据一起被提取?
答案 0 :(得分:6)
Hibernate不能像@ToMany
关系中的集合/列表那样代理您自己的对象,因此延迟加载不起作用。
我认为此链接有助于了解您的问题:http://justonjava.blogspot.co.uk/2010/09/lazy-one-to-one-and-one-to-many.html
答案 1 :(得分:0)
根据您的评论,由于PersonDetail
实体包含引用Person
实体的外键列,因此您看起来只有1个问题:
实体关系包括关系所有者的概念(在本例中为PersonDetail
),这意味着您要在@JoinColumn
中添加PersonDetail
注释实体。
您已经使用添加到关联注释的mappedBy
属性正确定义了关系的反面(不是关系的所有者的实体)({ {1}}在你的情况下)使关系成双向,这意味着可以从@OneToOne
实例到达关联的PersonDetail
。
鉴于评论中澄清的关系,您只需对代码进行1次更改,如下所示:
Person