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

时间:2014-02-01 14:57:40

标签: java hibernate lazy-loading

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

2 个答案:

答案 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