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

Ern*_*nio 1 java hibernate jpa

我将 Spring 与 JPA (Hibernate) 一起使用。

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

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

Box举例来说:假设一个 中有多个es Warehouse。鉴于这是 ManyToOne 关系(如上所述,实现它的方法很少,为了这个例子,我们假设Warehouse是拥有方) - 它可以在两端都是惰性的(你可以 loadBox和 lazily Warehouse,但加载Warehouse不会加载所有Boxes 它)有,只有当你真正得到它们时)?

这样的代码片段看起来怎么样——我是否只是用 JPA 的 LAZY 注释两端,或者其他一些,也许是 Hibernate 特定的东西?

Mar*_*orn 5

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

Hibernate 建议静态地将所有关联标记为惰性,并使用动态获取策略来实现急切。不幸的是,这与 JPA 规范不一致,JPA 规范定义默认情况下应立即获取所有一对一和多对一关联。Hibernate 作为 JPA 提供者,遵循该默认设置。

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

@OneToMany(mappedBy = "...", fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY)
Run Code Online (Sandbox Code Playgroud)

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

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
Run Code Online (Sandbox Code Playgroud)