JPA默认获取类型

问题描述:

从我的理解@OneToOne@ManyToOne JPA注释做eager fetch。我希望这些在我的应用程序中被延迟加载,或者至少暗示它(这是hibernate默认的)。我已经开始添加注释fetch = FetchType.LAZYJPA默认获取类型

例如

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

代替

@ManyToOne(optional = false) 

这是既麻烦又容易出错。有没有办法在应用程序级别执行此操作?也许在persistence.xml中?

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

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

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

没有办法。在JPA规范中没有关于改变全局获取策略的信息。 JPA提供1-1/N-1关联EAGER提取,而1-N/M-N则提供LAZY。所有JPA实现都应遵循规范以符合规范。我认为,应用程序开发人员最好不要在全球范围内更改此默认值,因为这几乎是大多数情况下的最佳实践,除非您只有一种类型的所有实体之间的关联,如1-1。考虑一下,你可以在一个应用程序中将其设置为“EAGER”,该应用程序包含一个真正丰富的实体模型,它具有复杂的关系和数据库中数百万的数据。手动覆盖每个关联的获取策略可以让开发人员对未来发生的事情负责。它不容易出错,而是一个强大的功能。

+0

您使用一对一来证明这一点,但多对一是*远远*更常见的关联类型。是的,在一对一关联的情况下,提前获取可能更好。懒惰作为默认更好的原因更多的是这样一个事实,即有很多定义明确的方法可以使运行时(在Hibernate和JPA中)都非常渴望,但几乎没有办法明确地使它们懒。 – 2012-10-02 14:39:31

+0

在这种情况下,一对一和多对一是如何不同的,一个人如何证明另一个人没有证明是正当的?我强烈认为Erhan在这方面有一点意义。如果您有产品,但客户希望将其与不同的JPA实施一起使用。然后,他们最终会出现不一致,或者他们将不得不修改原始代码以使其与其他实现兼容。 然而,你完全正确地说在运行时不可能将关系变成懒惰。 – 2012-10-09 06:39:25

+0

因为经验表明一对一关系比多对一关系要频繁得多,正如我已经指出的那样。你是理想主义的;我很务实。我更喜欢现实世界的解决方案 – 2012-10-09 13:25:21

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

JPA保证单值关系的急切加载(如果不是通过注释或持久性XML声明的话)。对于集合值关系,则默认为延迟加载,但延迟加载(只)的提示,持久性提供支持JPA,所以你不能依赖它,并把检查特定提供商(例如休眠,OpenJPA的)。请参阅this link作为参考,并获得更多见解。

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

话虽如此,至于你的建议,你需要一个具体的(说实话不是完全不寻常的)案件来处理。现在你有一个案例,但有数百个这样的案例。所以要编写规范,你需要在泛化和粒度之间画一条线。

如果我是你的鞋子,如果你认为这是一个绝对有用的功能要添加到JPA规范,我会提交给JCP。另一方面,如果你在特定的实现中得到这个(,那个和那个...),那么你最终会得到所谓的供应商锁定。因此,我会额外花费一小时在@ManyToOne @OneToOne属性上设置懒惰获取并保持供应商免费,因此如果说新的JPA实现出现的速度超过15倍,那么Hibernate(或其他任何实现使用),那么只需花费很少的努力即可将您的项目移至新的JPA实施。

+2

你完全错误地认为“Hibernate特别无法处理2个渴望关联中的联结提取”。这完全是错误的。 – 2012-10-08 17:23:21

+0

你可能想谷歌“org.hibernate.loader.MultipleBagFetchException:不能同时取多个行李” – 2012-10-09 06:17:57

+0

行李其实是一个特殊类型的集合没有定义的JPA ... – 2012-10-09 13:06:08