Java 实体类和final关键字

Java 实体类和final关键字,java,entity,persistence,final,Java,Entity,Persistence,Final,从 根据定义,实体是可以持久化到 数据库,因此在上下文中使用最后一个字段是没有意义的 最终将成为数据库中记录的内容 有人能详细解释一下为什么使用最后一个字段没有意义吗?您可以使用它们,但它们将作为一个整体从持久性中排除。所以它们不会被加载或保存。这就是JPA的工作原理 static int transient1; // not persistent because of static final int transient2 = 0; // not persistent because of

根据定义,实体是可以持久化到 数据库,因此在上下文中使用最后一个字段是没有意义的 最终将成为数据库中记录的内容


有人能详细解释一下为什么使用最后一个字段没有意义吗?

您可以使用它们,但它们将作为一个整体从持久性中排除。所以它们不会被加载或保存。这就是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
中的某个值。所以它没有什么价值,如果像这样使用它会很难闻。

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

详细说明:

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


代理是通过在运行时对对象(例如学生实体类)进行子分类来动态创建的。子类覆盖父类的所有方法,当访问任何方法时,代理从DB加载真实对象并调用该对象上的实际方法。如果我们将实体类设为final,那么该实体类就不能被子类化,因为final类不能被继承。

您引用的答案非常详细。你不明白哪一部分?你为什么不在那里问,作者在哪里可以看到和回复?@ErickG.Hagstrom的可能副本我似乎没有在数据库中获得不可变变量/字段和记录/元组之间的连接,但这就是重点。实体类的实例是数据库关系的对象表示。它们的存在是为了允许在Java对象上执行对数据库的创建/读取/更新/删除(CRUD)操作,而无需编写SQL语句;那么作者就可以对答案作进一步的阐述了。