为什么JPA中的实体类不能是最终的或者有最终方法?引自here -
实体类必须遵循以下要求:
...
不得将该类声明为
final
。不能声明任何方法或持久性实例变量final
。
是什么原因? JPA是否对实体类进行了子类化并重新定义了方法?
答案 0 :(得分:28)
根据定义,实体是一个可以持久化到数据库的类,因此在最终成为数据库记录的上下文中使用final字段是没有意义的。没有最终类和最终方法的要求与JPA实现实际处理实体类的持久化实例的方式有关。
实现通常在运行时将类子类化和/或动态地向您的类添加字节代码,以便检测何时发生对实体对象的更改。如果你的班级被宣布为最终,那就不可能。
当然有很多原因而不仅仅是那些,这里有一个article,它提供了有关ORM如何在幕后工作的更多信息,这可能有助于您更好地理解JPA实体的其他要求。
答案 1 :(得分:0)
因为持久性提供程序是对象的代理。这些代理正在创建实体/类的运行时子类,也可能添加一些标志来标识数据是否有变化。所以这就是为什么你的班级不应该是最终有能力改变它的原因。