20

根据我的理解@OneToOne@ManyToOneJPA 注释进行eager提取。我希望这些延迟加载到我的应用程序中,或者至少暗示它(这是休眠默认的)。我已经开始添加注释fetch = FetchType.LAZY

例如

@ManyToOne(optional = false, fetch = FetchType.LAZY)

代替

@ManyToOne(optional = false)

这既乏味又容易出错。有没有办法在应用程序级别做到这一点?也许在persistence.xml 中?

4

4 回答 4

19

迄今为止,我选择让 Hibernate 在通过注释映射方面遵循 JPA 规范,仅仅是因为我没有收到任何使其可配置的功能请求,这让 TBH 感到惊讶。正如您所指出的,从 Hibernate 3.0 开始,您想要的是使用hbm.xml映射文件时的默认设置。

正如另一个答案所建议的那样,通过配置允许这样做不会违反规范。

长话短说,不,今天不可能。如果您希望看到它是可配置的,请创建一个功能请求。

于 2012-10-02T14:34:46.233 回答
6

JPA 规范假定通常大多数应用程序默认情况下需要单例关系是急切的,而默认情况下多值关系是惰性的。至少根据我自己的经验,这通常是所需的架构。这是有道理的,因为单例关系在 JPA 层和 DB 层中不需要显着的额外性能就可以在外键上创建单例连接。然而,与此相反,多值属性创建 N + 1 问题或大型笛卡尔结果集,当使用连接提取时,随着集合中元素的数量和连接数量的增加,这些结果集会呈指数膨胀(尽管 Hibernate 特别无法处理2+ 急切的联想)。

话虽如此,至于您的建议,您需要解决一个特定的(老实说并非完全不常见的)案例。现在你有一个案例,但有数百个这样的案例。因此,要编写规范,您需要在泛化和粒度之间划清界限。

如果我站在你的立场上,如果你认为这是一个绝对有用的特性,可以添加到 JPA 规范中,我会将它提交给 JCP。另一方面,如果您在特定实现中解决了这个(、那个和那个......),那么您最终会陷入所谓的供应商锁定。所以我会额外工作一个小时来设置 @ManyToOne @OneToOne 属性的延迟获取并保持无供应商,因此如果说一个新的 JPA 实现比 Hibernate 快 15 倍以上(或任何你想要的实现),请坚持规范使用),将您的项目迁移到新的 JPA 实现几乎不需要任何努力。

于 2012-10-05T21:36:21.940 回答
3

没门。JPA 规范中没有关于更改全局获取策略的内容。JPA 为 1-1/N-1 关联提供 EAGER 获取,而对于 1-N/MN,它是 LAZY。所有 JPA 实现都应遵循规范以符合要求。我认为,应用程序开发人员最好不能全局更改此默认行为,因为这些是几乎大多数情况下的最佳实践,除非您在所有实体之间只有一种类型的关联,例如 1-1。想一想,您可以在应用程序中将其设置为“EAGER”,该应用程序包含一个非常丰富的实体模型,具有复杂的关系和数百万数据库中的数据。手动覆盖每个关联的获取策略允许开发人员对接下来会发生什么负责。它不容易出错,而是一个强大的功能。

于 2012-10-02T13:09:48.980 回答
1

据我了解,@oneToOne 和 @ManyToOne JPA 注释做了一个急切的 fectch。

如果注释或持久性 XML 中没有另外声明,JPA 保证对单值关系进行预加载。对于集合值关系,它默认为延迟加载,但延迟加载(只是)对支持 JPA 的持久性提供程序的提示,因此您不能依赖它,并且必须检查特定提供程序(例如 Hibernate、OpenJPA)。请参阅此链接作为参考,并了解更多信息。

于 2012-10-05T12:18:35.240 回答