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