所有JPA实体类方法都不能是最终的,这是真的吗?

时间:2013-12-16 23:34:58

标签: jpa

JPA 2.1规范说:

  

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

在实体类中,“没有方法”真的意味着每一种方法 - privatestaticprotected,非状态变化等吗?或者这是否应该传达只有@Access(AccessType.PROPERTY)注释的方法才被禁止final

我理解为什么实体类不能是final,我理解为什么实体类的持久化实例变量不能是final。我也理解为什么持久属性访问器和mutator不能是final

我不明白为什么所有其他方法(例如,操纵transient字段或无状态,或staticprivate)的方法不能{{1 }}

我能猜测的最好的是规范想要在任何地方打开门以进行字节码注入 - 例如。也许我的无状态方法调用getter需要重新调用该调用来调用某种类型的JPA-provider注入方法。

当然,这种限制使得很难将类似实体的类从其他地方重新用作构建块,因为它们中的一些可能具有final方法,但是以其他方式适合用{{1}进行扩充。从而转换为JPA实体。

1 个答案:

答案 0 :(得分:0)

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

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

与其他方法相关而不是加速器/变换器,我认为没有它们是最终的是有意义的,因为找出方法是否访问或不是持久数据真的很复杂。如果该方法是私有的,那可能仍然是个问题,因为你可以用反射来调用它。

另外,正如我记得的那样,我在JPA 2.0中找到了另一个不明确的地方(并且我的测试已经展示了如何解释它)。

PS:当然这只是我的观点,不是基于任何文章或官方文档。