我在@OneToOne
和A
之间存在双向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
上,是否会受到尊重?在什么情况下?
答案 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编织。