在双向@OneToOne JPA关系中,是否可以在关系的两端指定获取类型?

时间:2013-04-30 17:46:41

标签: jpa

我在@OneToOneA之间存在双向B关系。 A拥有这种关系。所以,在A.java

@OneToOne // no need for mappedBy here because A owns this relationship
private B b;

B.java

@OneToOne(mappedBy = "b") // A's "b" field owns this relationship
private A a;

我的抓取类型选项有哪些?他们两边可以不同吗?也就是说,我是否可以指定A的关系来急切地抓取关联的B,同时告诉B懒惰地抓取关联的A

或者,相关:如果我将fetch = FetchType.EAGER放在B#a上,是否会受到尊重?在什么情况下?

2 个答案:

答案 0 :(得分:0)

编辑:删除了错误的声明(OneToOne总是急切地获取)

OneToOne似乎是使用字节码检测实现的。 见JPA 2.0 / Hibernate: Why does LAZY fetching with "@OneToOne" work out of the box?

似乎你不能在拥有和反面都定义延迟抓取。

对于其他关系,fetch类型可用于双向关系的两侧,它只是告诉entityManager检索关联的对象,或者在检索当前实例时用代理替换它。

答案 1 :(得分:0)

OneToOne和ManyToOne的默认提取是EAGER,对于OneToMany,ManyToMany和ElementCollection,它是LAZY。

您可以使用您想要的任何设置配置mappedBy任意一侧的提取,既可以是LAZY,也可以是EAGER,也可以是混合。

一般来说,我建议总是使用LAZY。如果您需要提取的内容,最好在查询级别指定它,因为您可能并不总是需要它。

如何实施LAZY取决于JPA提供商。对于EclipseLink,使用字节码编织,并且需要在Java SE中使用代理。在Java EE中,它默认工作(在兼容的Java EE服务器上)。您也可以使用静态编织。 Spring还允许在不使用代理的情况下在Java SE中进行JPA编织。