【问题标题】:Hibernate lazy loading isn't working in @OneToOne MappingHibernate 延迟加载在 @OneToOne 映射中不起作用
【发布时间】:2019-05-21 06:26:43
【问题描述】:

虽然应用了延迟加载,但它仍在运行所有 4 个查询, 但我只取:

   System.out.println("Author's Name: " + b.getEmail());


    public class Author  {

        @Id
        @Column(name = "AUTHOR_ID")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
        private String name;
        private String email;

        @OneToOne(mappedBy = "author", fetch = FetchType.LAZY)
        private Book book;
        @OneToOne(mappedBy = "author", fetch = FetchType.LAZY)
        private Address address;
        @OneToOne(mappedBy = "author", fetch = FetchType.LAZY)
        private Location location;
    }
public class BooksManager {
    public static void main(String[] args) {
        Author b = (Author) session.get(Author.class, 6L);
        System.out.println("Author's Name: " + b.getEmail());
    }
}

它正在运行上述代码的所有 4 个查询:

Hibernate: select author0_.AUTHOR_ID as AUTHOR_I1_1_0_, author0_.email as email2_1_0_, author0_.name as name3_1_0_ from AUTHOR author0_ where author0_.AUTHOR_ID=?

Hibernate: select address0_.address_id as address_1_0_0_, address0_.description as descript2_0_0_, address0_.PUBLISHED as PUBLISHE3_0_0_, address0_.title as title4_0_0_ from ADDRESS address0_ where address0_.address_id=?

Hibernate: select book0_.book_id as book_id1_2_0_, book0_.description as descript2_2_0_, book0_.PUBLISHED as PUBLISHE3_2_0_, book0_.title as title4_2_0_ from BOOK book0_ where book0_.book_id=?

Hibernate: select location0_.location_id as location1_3_0_, location0_.description as descript2_3_0_, location0_.PUBLISHED as PUBLISHE3_3_0_, location0_.title as title4_3_0_ from LOCATION location0_ where location0_.location_id=?

【问题讨论】:

  • session 是什么?这个例子甚至不完整。

标签: java sql hibernate jpa


【解决方案1】:

在您的定义中,所有 3 个 OneToOne 关系都是可选的(可为空的)。 当休眠加载实体作者时,它必须为关系创建 3 个代理。但是如果一个属性是 null ,hibernate 不应该为那个属性创建代理。 现在休眠以某种方式必须知道该属性是否为空。 所以它必须查找所有其他 3 个表才能检测到这一点。 最后,hibernate 足够聪明,可以忽略为延迟加载所做的提示并急切地加载它们。

【讨论】:

  • 那么解决办法是什么
  • 改变你的设计,不自然,一个作者可以写一本书?如果作者有地址,为什么地址保留作者 ID,而不是它应该是其他方式。
  • 这是一个示例代码,在项目中这是要求,我可以更改关系@OneToMany 它也会解决我的问题,但我想在@OneToOne 映射中是否有其他解决方案
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多