java - 实体类和final关键字

标签 java entity persistence final

来自another thread

By definition, an entity is a class that can be persisted to a database, so having a final field would make no sense in the context of something that will end up being a record in your database.

有人可以详细说明为什么拥有最终字段没有意义吗?

最佳答案

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

详细说明:

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

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

关于java - 实体类和final关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34417551/

相关文章:

java - Controller 中的并行流中没有线程绑定(bind)请求错误

Hibernate 和 JPA - 错误映射通过接口(interface)公开的嵌入式类

java - 如何将数字格式化为标准货币格式(逗号分隔的数字)

java - 实体列表中某个值的出现频率

php - Symfony 使 :entity add property failed?

java - JPA - 具有一对多关系的实体不返回数据

python - 如何使用 python 从 OpenCV 3 中的持久性 XML/YAML 文件读取/写入矩阵?

java - entityManager.persist(用户) -> javax.persistence.EntityExistsException : User@b3089 is already persistent

java - 当我可以将类文件复制到新的 JVM 时,为什么要在 java 中进行序列化?两者都执行相同的任务,对吗?

java - 使用相同的父标签和子标签解析 Java 中的 XML