Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实体类必须具有非参数构造函数_Java_Hibernate_Jpa_Eclipselink_Entitymanager - Fatal编程技术网

Java 实体类必须具有非参数构造函数

Java 实体类必须具有非参数构造函数,java,hibernate,jpa,eclipselink,entitymanager,Java,Hibernate,Jpa,Eclipselink,Entitymanager,我在学习JPA,所以在学习a的时候,我遇到了一句话,上面写着: 所有实体类都必须定义主键,并且必须具有非参数 构造函数和/或不允许为最终值 我听不懂这句话。我们是否需要专门编写一个非参数化构造函数,因为默认的非参数化构造函数总是由类继承的 它们不允许是final是什么意思,这是否意味着我们总是可以扩展实体类?如果是这样,为什么这是强制的,为什么它不能是最终的,默认情况下,当您的类中没有定义与JPA无关的构造函数时,您将得到非参数构造函数。是如果要定义构造函数,则必须定义无参数构造函数,如: p

我在学习JPA,所以在学习a的时候,我遇到了一句话,上面写着:

所有实体类都必须定义主键,并且必须具有非参数 构造函数和/或不允许为最终值

我听不懂这句话。我们是否需要专门编写一个非参数化构造函数,因为默认的非参数化构造函数总是由类继承的


它们不允许是final是什么意思,这是否意味着我们总是可以扩展实体类?如果是这样,为什么这是强制的,为什么它不能是最终的,默认情况下,当您的类中没有定义与JPA无关的构造函数时,您将得到非参数构造函数。是如果要定义构造函数,则必须定义无参数构造函数,如:

 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
 }

使类成为最终的意思是你不能子类化。JPA供应商(如Hibernate)创建代理来延迟获取行,这将最终限制性能调优的选项。因此,您可以看到,您的类可能是/可能不是最终的,这取决于您的用例。

如果我错了,请纠正我。因此,如果我使用Hibernate实现,我没有选择将其作为最终版本。但是在其他实现的情况下,我可能有一个选择。因此,如果您希望延迟加载数据,那么不要将您的类标记为final,否则使用任何框架,您都可以将您的类标记为final。延迟加载数据是什么意思?我认为数据是在commit()上提交的。我认为我必须进一步研究延迟加载数据,如果你能给我一个好教程的链接,那将非常有帮助。就这个问题而言,我接受你的答案。当构造函数过载时,实体中需要一个默认构造函数。实体类可以被代理。任何可代理的类都不能是final,比如ejb和cdibean。如果您试图使它们成为最终的,您将收到编译时错误(类似于-
类是不可验证的
),我可以理解JPA使用了一些概念,如类代理,它需要类是非最终的。它是否类似于所谓的延迟数据加载。我想我需要研究这两个概念,我还没有听说过。FWIW不是所有的实现都使用“类代理”,因此也不是所有的实现都有这个“最终”限制。