[英]How hibernate is initializing final fields using the no-arg constructor?
[英]Hibernate and no-arg constructor
如果创建其他构造函数,java将不会创建隐式构造函数。
为实体类显式定义no-arg构造函数没有特别的好处 (但请记住,Hibernate框架在内部使用no-arg构造函数通过Java反射API填充实体)。
Hibernate Entity Bean Classes必须要求no-arg构造函数,这些构造函数可以由程序员显式定义(或由Java生成。)。
一个重要的一点是, 当您为类定义自己的构造函数时 ,需要自己提供no-arg构造函数 (因为编译器在这种情况下不提供)。
在Hibernate中,no-arg构造函数用于通过Reflection加载数据库实体(用于在运行时检查或修改应用程序行为)。
即使对于Hibernate
,默认的no arg构造函数的实现也不是强制性的 ,因为java会自动且隐含地管理它。
并且您需要指定它的唯一情况是您声明另一个参数化构造函数 。
如果你看一下No-Arg构造函数 ,你会看到:
每个类至少有一个构造函数。 有两种情况:
如果您没有为类编写构造函数,Java会为您生成一个构造函数。 生成的构造函数称为默认构造函数。 它在您的代码中不可见,但它就是一样的。 如果你能看到它,它看起来像这样(对于类Dog):public Dog(){}注意这个默认构造函数不带参数,并且有一个什么都不做的主体。
如果您为类编写构造函数,Java不会生成默认构造函数。 如果您有预先存在的使用默认构造函数的代码,则可能会出现问题。
如果您没有定义任何构造函数,编译器将生成默认构造函数,如JLS中所述:
如果类不包含构造函数声明,则隐式声明没有形式参数且没有throws子句的默认构造函数。
如果声明的类是原始类Object,则默认构造函数具有空体。 否则,默认构造函数只调用不带参数的超类构造函数。
这意味着您不必为Hibernate实体显式实现no-arg构造函数,只要:
throws
子句。 Java类可能没有隐式默认构造函数。 假设你有这样一个类:
public class A {
public A(String st) {}
}
最终唯一的构造函数是A(String st),而不是A(String st)和A()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.