3

我在和之间有双向@OneToOne关系。 拥有关系。所以,在:ABAA.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.EAGERB#a,是否受到尊重?在什么情况下?

4

2 回答 2

0

编辑:删除虚假陈述(OneToOne 总是急切地获取)

OneToOne 似乎是使用字节码检测来实现的。请参阅JPA 2.0 / Hibernate:为什么使用“@OneToOne”进行 LAZY 提取可以开箱即用?

似乎您无法在拥有和反向方面定义延迟获取。

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

于 2013-04-30T18:43:15.030 回答
0

OneToOne 和 ManyToOne 的默认获取是 EAGER,而 OneToMany、ManyToMany 和 ElementCollection 的默认获取是 LAZY。

您可以使用所需的任何设置在 mappedBy 的任一侧配置 fetch,既可以是 LAZY,也可以是 EAGER,或者混合使用。

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

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

于 2013-05-01T12:58:31.267 回答