实体类和最终关键字

时间:2015-12-22 13:58:34

标签: java entity persistence final

来自another thread

  

根据定义,实体是一个可以持久化为a的类   数据库,因此在上下文中使用final字段是没有意义的   最终会成为数据库记录的东西。

有人可以详细说明为什么最后一个字段没有意义吗?

2 个答案:

答案 0 :(得分:4)

通常,持久性提供程序使用某些库(如CGLIB或javassist)来创建对象的代理。这些代理正在创建实体的运行时子类。这就是为什么他们不应该是最终的。

详细说明:

你可以让Hibernate Entity类成为最终版,但这不是一个好习惯。由于Hibernate使用代理模式来提高性能,因此,在延迟关联的情况下,通过使实体最终,Hibernate将不再能够使用代理,因为Java不允许扩展最终类,从而限制了性能改进选项。但是,如果你的持久化类是接口的实现,你可以避免这种惩罚,它声明了实体类中定义的所有公共方法。

通过在运行时对对象(例如Student实体类)进行子类化来动态创建代理。子类重写父类的所有方法,当访问任何方法时,代理从DB加载实际对象并调用该对象上的实际方法。如果我们将实体类设为final,则该实体类不能被子类化,因为最终的类不能被继承。

答案 1 :(得分:3)

您可以拥有它们,但它们将作为"Transient" field从持久性中排除。所以它们不会被加载或保存。这就是JPA的工作原理。

static int transient1; // not persistent because of static
final int transient2 = 0;  // not persistent because of final
transient int transient3; // not persistent because of transient
@Transient int transient4; // not persistent because of @Transient

因此,因为JPA需要无参数构造函数,所以必须将该构造函数中的final或它的声明设置为固定值或来自static的值。所以它几乎没有价值,如果像这样使用它会很臭。