我正在使用带有JPA(休眠)的Spring。
当我从许多站点学习关系时(实现它们的方式很少),也有关于获取类型的讨论,但是我在这里问的问题从未得到完全回答。
我想知道是否存在双向关系不能偷懒的情况? 有时候单向也可以不偷懒吗?
例如:
假设一个Box
中有许多Warehouse
。鉴于这是ManyToOne关系(如上所述,为实现此示例,假设Warehouse
是拥有方,很少有实现它的方式)-它两端是否都可以懒惰(可以加载Box
,并且懒惰的Warehouse
,但是加载Warehouse
不会加载它拥有的所有Box
,只有当您实际获得它们时才加载)?
这样的代码片段看起来如何-我只是用JPA的LAZY或其他某些特定于Hibernate的东西来注释两端吗?
答案 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