JPA @ManyToOne for hibernate

时间:2016-10-08 22:43:33

标签: hibernate jpa

  • 旧学校休眠 - ManyToOne很懒散
  • JPA - ManyToOne非常渴望

在OneToMany中都是懒惰的感谢上帝。

hibernate中是否有设置覆盖这个非常糟糕的设置?有太多人继续添加ManyToOnes而没有将它们设置为懒惰(即,他们忘记添加FetchType.LAZY)导致大量不必要的连接,并且在某些情况下导致6个表被连接,这是不需要的。

除非开发人员转向JQL以急切地获取某些东西,否则一切都应该是懒惰的。然后它更加一致,并帮助开发人员在每次添加ManyToOne注释时都不会犯这些错误

或者,在hibernate 5.2中,仍然可以使用hibernate注释吗?但是我需要以某种方式摆脱类路径上的JPA注释,因为我担心它们会不小心回到我们身边(我们都是人类和所有人)。

我发现这篇很棒的文章解释了它比我对所有事情都应该变得懒惰更好https://vladmihalcea.com/eager-fetching-is-a-code-smell/

感谢, 迪安

2 个答案:

答案 0 :(得分:2)

Hibernate(或任何其他框架)不可能将注释属性的默认值与设置的相同值区分开来。

我的意思是在运行时@ManyToOne@ManyToOne(fetch = FetchType.EAGER)完全相同。

但由于你无法改变运行时行为,你至少可以调整编译时间:你可以添加一个 Checkstyle 规则(或任何类似的)来强制你的同事总是设置提取明确键入。

Checkstyle示例:

<module name="RegexpSinglelineJava">
  <property name="format" value="@(One|Many)ToOne(?!\([^)]*fetch)"/>
  <property name="message" value="Please declare the fetch type (and use EAGER sparingly)"/>
  <property name="ignoreComments" value="true"/>
</module>

如果在@OneToOne@ManyToOne之后未定义提取,则会添加编译时警告。

答案 1 :(得分:1)

无法全局覆盖默认值,但您可以尝试获取源代码,进行更改并进行编译。

https://github.com/eclipse/javax.persistence/blob/master/src/javax/persistence/ManyToOne.java

第111行。

FetchType fetch() default EAGER;