所有双向关系都可以是LAZY吗?

时间:2018-11-07 13:54:08

标签: java hibernate jpa

我正在使用带有JPA(休眠)的Spring。

当我从许多站点学习关系时(实现它们的方式很少),也有关于获取类型的讨论,但是我在这里问的问题从未得到完全回答。

我想知道是否存在双向关系不能偷懒的情况? 有时候单向也可以不偷懒吗?

例如: 假设一个Box中有许多Warehouse。鉴于这是ManyToOne关系(如上所述,为实现此示例,假设Warehouse是拥有方,很少有实现它的方式)-它两端是否都可以懒惰(可以加载Box,并且懒惰的Warehouse,但是加载Warehouse不会加载它拥有的所有Box,只有当您实际获得它们时才加载)?

这样的代码片段看起来如何-我只是用JPA的LAZY或其他某些特定于Hibernate的东西来注释两端吗?

1 个答案:

答案 0 :(得分:3)

所有关系都可以是懒惰的,从Hibernate文档中,建议将所有关系都标记为懒惰:http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#fetching-strategies

  

Hibernate的建议是静态地标记所有懒惰的关联,并使用动态获取策略来提高渴望。不幸的是,这与JPA规范不一致,该规范定义默认应急切获取所有一对一和多对一关联。作为JPA提供者,Hibernate遵守默认设置。

您只需将双方关系标记为懒惰:

@OneToMany(mappedBy = "...", fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY)

映射的默认值(如果未指定fetch)为:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER