JPA的默认获取类型(JPA default fetch type)

2019-07-28 22:55发布

从我的理解@OneToOne@ManyToOne JPA注释做一个eager获取。 我想这将延迟加载在我的应用程序,或者它至少提示(这是什么休眠默认)。 我已经开始添加注释fetch = FetchType.LAZY

例如

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

代替

@ManyToOne(optional = false)

这是既麻烦又容易出错。 有没有一种方法,我可以在应用层面做到这一点? 在persistence.xml吧?

Answer 1:

到今天为止,我已经选择了具有休眠按照映射方面JPA规范通过注释,只是因为我还没有收到使其配置的任何功能请求,这是令人吃惊的TBH。 正如你所指出的,因为Hibernate 3.0你想要的东西已经被默认设置使用时hbm.xml映射文件。

通过配置允许这不会违反规范作为另一个答案建议。

所以长话短说,没有今天是不可能的。 创建一个功能要求,如果你想看到的是可配置的。



Answer 2:

JPA规范假定一般大多数应用都需要通过默认的单身关系渴望,而由默认值多关系偷懒。 至少在我自己的经验,这通常是理想的架构。 这是有道理的,因为单身的关系需要在JPA层和数据库层没有显著附加性能上创建外键一个单身加盟。 然而,矛盾的是,多值属性创建或者N + 1个问题或大笛卡尔结果集是得到成倍膨胀为集合元素的数量和连接抓取时使用人数的加入增加(尽管休眠专门无法处理连接获取上2+渴望协会)。

话虽如此,对于你的建议,你需要一个特定的(说实话不完全少见)的情况下加以解决。 现在你有一个单一的情况下,但也有数百个这样的案件。 所以,写规范你需要绘制的泛化和粒度之间的一条线。

如果我是你的话,如果你想添加到JPA规范这绝对是很有用的功能,我将它提交给JCP。 在另一方面,如果你得到这个(即和...),在具体实施处理,那么你在所谓的供应商锁相结束。 因此,我将努力一个小时来设置@ManyToOne @OneToOne懒惰获取属性并保持供应商免费,因此通过坚持规范如果说一个新的JPA实现走来就是快超过15倍,则Hibernate(或任何你实现使用),它会采取几乎没有力气移动你的项目,新的JPA实现。



Answer 3:

没门。 没有什么关于JPA规范不断变化的全球抓取策略。 JPA提供了1-1 / N-1关联EAGER取出,而对于1-N / MN是懒惰。 所有的JPA实现应遵循的规范是兼容的。 我认为,这是更好的,除非你已经所有实体之间只是一种类型的协会,如1-1应用程序开发人员不能更改此默认beheavior全球范围内,因为这些都是最好的做法几乎在大多数情况下。 想一想,你可以将其设置为在应用程序,其中包含与数据库中的数据的复杂关系和百万一个非常丰富的实体模型“心切”。 重写每个关联的数据抓取策略手动允许开发商采取什么会发生旁边的责任。 它不容易出错,相反,一个强大的功能。



Answer 4:

从我的理解@OneToOne和@ManyToOne JPA注释做一个渴望fectch。

JPA保证在单值关系的渴望加载,如果没有被注解或持久性XML中声明。 对于集合值关系,则默认为延迟加载,但延迟加载(只)的提示,持久性提供支持JPA,所以你不能依赖它,并把检查特定提供商(例如休眠,OpenJPA的)。 见这个链接作为参考,而对于更深入的了解。



文章来源: JPA default fetch type