JPA 缺省回迁类型

2022-09-02 09:54:28

根据我的理解和JPA注释做一个获取。我希望这些在我的应用程序中懒惰地加载,或者至少暗示它(这是hibernate默认的)。我已经开始添加注释@OneToOne@ManyToOneeagerfetch = FetchType.LAZY

例如

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

而不是

@ManyToOne(optional = false)

这既繁琐又容易出错。有没有办法在应用程序级别执行此操作?在坚持中.xml也许?


答案 1

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

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

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


答案 2

JPA Spec 假定,一般来说,大多数应用程序都要求单例关系缺省急切,而多值关系缺省情况下是惰性的。至少在我自己的经验中,这通常是所需的架构。这是有道理的,因为单例关系不需要在 JPA 层和数据库层中显著的额外性能即可在外键上创建单例连接。然而,与此相反的是,多值属性要么创建 N + 1 个问题,要么创建大型笛卡尔结果集,当使用连接提取时,随着集合中的元素数和连接数的增加,结果集呈指数级膨胀(尽管 Hibernate 特别无法处理 2 个以上 eager 关联的连接提取)。

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

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


推荐