JPA 2.1规范说:
实体类不能是最终的。实体类的任何方法或持久性实例变量都不是最终的。
在实体类中,“没有方法”真的意味着每一种方法 - private
,static
,protected
,非状态变化等吗?或者这是否应该传达只有@Access(AccessType.PROPERTY)
注释的方法才被禁止final
?
我理解为什么实体类不能是final
,我理解为什么实体类的持久化实例变量不能是final
。我也理解为什么持久属性访问器和mutator不能是final
。
我不明白为什么所有其他方法(例如,操纵transient
字段或无状态,或static
或private
)的方法不能{{1 }}
我能猜测的最好的是规范想要在任何地方打开门以进行字节码注入 - 例如。也许我的无状态方法调用getter需要重新调用该调用来调用某种类型的JPA-provider注入方法。
当然,这种限制使得很难将类似实体的类从其他地方重新用作构建块,因为它们中的一些可能具有final
方法,但是以其他方式适合用{{1}进行扩充。从而转换为JPA实体。
答案 0 :(得分:0)
我认为这只是问题的一个不好的表述,这意味着它不是每种方法。
由于静态方法没有绑定到特定的实体实例,这意味着更改/控制该静态方法的行为将是非常愚蠢的。想象一下,何时从与持久性无关的上下文调用它。所以这就是为什么我认为这是一个配方错误。
与其他方法相关而不是加速器/变换器,我认为没有它们是最终的是有意义的,因为找出方法是否访问或不是持久数据真的很复杂。如果该方法是私有的,那可能仍然是个问题,因为你可以用反射来调用它。
另外,正如我记得的那样,我在JPA 2.0中找到了另一个不明确的地方(并且我的测试已经展示了如何解释它)。
PS:当然这只是我的观点,不是基于任何文章或官方文档。