【问题标题】:Why Lazy loading not working in one to one association?为什么延迟加载在一对一关联中不起作用?
【发布时间】:2014-02-01 14:57:39
【问题描述】:
@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 数据与人员数据一起被获取?

【问题讨论】:

  • 检查this线程,这很好解释。

标签: java hibernate lazy-loading


【解决方案1】:

Hibernate 无法像在 @ToMany 关系中为 Sets / Lists 代理您自己的对象,因此延迟加载不起作用。

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

【讨论】:

    【解决方案2】:

    根据您的评论,由于 PersonDetail 实体包含一个引用 Person 实体的外键列,因此您似乎只有 1 个问题:

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

    您已经使用添加到关联注释 (@OneToOne在您的情况下)使关系成为双向的,这意味着可以从 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...
    }
    

    【讨论】:

    • "根据您问题中的代码,我的猜测是 Person 实体的后备表包含一个引用 PersonDetail 实体的外键列。如果这是正确的,看起来您有 2问题:“反过来。见stackoverflow.com/questions/20934130/…
    • 好的,我已经根据您的评论更新了我的答案。我认为添加 @JoinColumn 注释是您应该更改的所有内容。
    • @MSach 我已更新我的答案以与您评论中的信息保持一致。如果您引用的其他 SO 问题回答了您的问题,您可能需要删除此问题或发布您自己的引用该问题的答案。这样一来,对于在寻求解决类似问题的帮助时找到解决此问题的方法的其他人仍然会有所帮助。
    • 我认为 @JoinColumn 注释甚至是不必要的,除非你需要给它诸如 nullable = false、updatable = false 等属性。JPA 已经可以判断它不是 @Basic 列。 . 所以@JoinColumn 注释可能不会做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多