【问题标题】:Entity classes and final keyword [closed]实体类和最终关键字[关闭]
【发布时间】:2015-12-22 22:39:11
【问题描述】:

来自another thread

根据定义,实体是可以持久化到 数据库,因此在上下文中使用 final 字段将毫无意义 最终将成为您数据库中的记录的东西。

有人能详细说明为什么有一个 final 字段没有意义吗?

【问题讨论】:

  • 你引用的答案很好地阐述了。哪一部分没看懂?而且你为什么不去那里问,作者在哪里可以看到和回复?
  • @ErickG.Hagstrom 我似乎没有得到数据库中不可变变量/字段和记录/元组之间的联系
  • 但这就是重点。实体类的实例是数据库关系的对象表示。它们的存在是为了允许对 Java 对象执行数据库上的创建/读取/更新/删除 (CRUD) 操作,而无需编写 SQL 语句。
  • 您应该在对原始答案的评论中询问;那么作者可以扩展答案。

标签: java entity persistence final


【解决方案1】:

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

详细说明:

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

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

【讨论】:

    【解决方案2】:

    您可以拥有它们,但它们将作为"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 的某个值。所以价值不大,这样用会很臭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多