【问题标题】:JPA @ManyToOne for hibernateJPA @ManyToOne 用于休眠
【发布时间】:2016-10-08 22:43:33
【问题描述】:
  • 老派休眠 - ManyToOne 很懒
  • JPA - ManyToOne 非常渴望

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

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

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

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

我发现这篇很棒的文章比我能更好地解释一切都应该如何变得懒惰https://vladmihalcea.com/eager-fetching-is-a-code-smell/

谢谢, 院长

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

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

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

    但由于您无法更改运行时行为,您至少可以调整编译时间:您可以添加一个 Checkstyle 规则(或任何类似规则),强制您的同事始终设置 fetch显式键入。

    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 之后未定义提取,则会添加编译时警告。

    【讨论】:

      【解决方案2】:

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

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

      第 111 行。

      FetchType fetch() default EAGER;
      

      【讨论】:

      • 至少对于 JEE 应用程序服务器(包含其他应用程序)来说,这是您无法做到的。所以我会谨慎使用 always 这个词。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多