【问题标题】:Is it really true that ALL JPA entity class methods must not be final?所有 JPA 实体类方法都不能是最终的,这真的是真的吗?
【发布时间】:2013-12-16 23:34:57
【问题描述】:

JPA 2.1 规范说:

实体类不能是最终的。实体类的任何方法或持久实例变量都不能是最终的。

“无方法”真的意味着实体类中的每个方法——privatestaticprotected、不改变状态等吗?或者这是否应该传达只有带有@Access(AccessType.PROPERTY) 注释的方法才被禁止成为final

我明白为什么实体类不能是final,我也明白为什么实体类的持久实例变量不能是final。我也明白为什么持久属性访问器和修改器不能是final

我不明白为什么所有其他方法(例如,操纵transient 字段的方法,或者是无状态的,或者static,或者private)不能是final

我能猜到的最好情况是规范希望为字节码注入敞开大门——例如。也许我的无状态方法对 getter 的调用需要重写该调用以调用某种 JPA-provider-injected 方法。

当然,这种限制使得从其他地方重用类似实体的类作为构建块变得很困难,因为其中一些可能具有final 方法,但在其他所有方面都适合用orm.xml 进行扩充,从而转换为 JPA 实体。

【问题讨论】:

    标签: jpa


    【解决方案1】:

    我认为这只是对问题的错误表述,这意味着它不是每一种方法。

    由于静态方法未绑定到特定实体实例,这意味着更改/控制该静态方法的行为真的很愚蠢。想象一下,当它从与持久性无关的上下文中调用时。所以这就是为什么我认为这是一个公式错误。

    与访问器/修改器以外的其他方法相关,我认为不将它们定为最终方法是有意义的,因为要找出方法是否访问持久数据确实很复杂。如果该方法是私有的,那仍然可能是个问题,因为您可以使用反射来调用它。

    另外,我记得我在 JPA 2.0 中发现了另一个地方,它是模棱两可的,(我的测试已经显示了如何解释它)。

    PS:当然这只是我个人的看法,并非基于任何文章或官方文档。

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      相关资源
      最近更新 更多