【问题标题】:Entity class must have non argumented constructor实体类必须有无参数的构造函数
【发布时间】:2015-07-04 00:02:36
【问题描述】:

我正在学习 JPA,所以在学习 JPA BLOG Vogella 1.2 Entity Heading 时,我遇到了这样一句话:

所有实体类必须定义一个主键,必须有一个非参数 构造函数和或不允许是最终的

我无法理解这条线。我们是否需要专门编写一个无参数构造函数,因为默认的无参数构造函数总是被类继承。

不允许成为 final 是什么意思,这是否意味着我们总是可以扩展实体类?如果是,为什么是这种强迫,为什么不能是最终的

【问题讨论】:

  • 当构造函数重载时,需要实体中的默认构造函数。实体类可以被代理。任何可代理的类都不能是最终的,例如 EJB 和 CDI bean。如果您尝试使它们成为最终版本,您将收到一个编译时错误(类似的东西 - Class is unproxyable)。
  • 我可以理解 JPA 使用了类代理之类的概念,它需要类是非最终的。它是否类似于提到的延迟数据加载。我想我需要研究这两个概念,我还没有听说过。
  • FWIW 并非所有实现都使用“类代理”,因此并非所有实现都有这个“最终”限制。

标签: java hibernate jpa eclipselink entitymanager


【解决方案1】:

默认情况下,当你的类中没有定义与 JPA 无关的构造函数时,你会得到非 arg 构造函数。是的,如果您要定义构造函数,那么您必须不定义 arg 构造函数,例如:

 public class Student {
      public Student() {}//default ctor which is needed by JPA to convert row from DB to java object
      public Student(int id) {..}//ctor which accepts one arg
 }

使类最终意味着你不能子类化。像 Hibernate 这样的 JPA 供应商会创建代理来延迟获取行,这最终会限制您的性能调整选项。因此,您会看到您的课程可能/可能不是最终课程,具体取决于您的用例。

【讨论】:

  • 如果我错了,请纠正我。所以我没有选择让它最终,以防我使用 Hibernate 实现。但在其他实现的情况下,我可能会有选择。
  • 因此,如果您希望延迟加载数据,请不要使用任何框架将您的类标记为最终类,否则您可以将您的类标记为最终类。
  • 懒加载数据是什么意思?我认为数据仅在 commit() 上提交
  • 我想我将不得不进一步研究懒惰地加载数据,如果你能给我一个好的教程的链接,那将很有帮助。就这个问题而言,我接受你的回答.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多