我们可以阅读here Hibenate要求所有@Entity
类都使用no-arg构造函数。但是,即使我们没有明确地声明一个默认的构造函数,java类也始终是隐式默认构造函数吗?
在我的项目中,我没有在我的@Entity
课程中声明一个无参数的构造函数,并且eveything正常工作。但另一方面,我认为Hibernate规范已经仔细编写,所以实际上可能会明确声明默认构造函数可能有一些好处吗?
答案 0 :(得分:8)
如果创建其他构造函数,java将不会创建隐式构造函数。
答案 1 :(得分:3)
为实体类显式定义no-arg构造函数没有特别的好处(但请记住,Hibernate框架在内部使用no-arg构造函数通过Java反射API填充实体)。
Hibernate Entity Bean Classes必须要求no-arg构造函数,这些构造函数可以由程序员显式定义(或由Java生成。)。
重要的一点是当您为类定义自己的构造函数时,您需要自己提供no-arg构造函数(因为编译器在这种情况下不提供。)
答案 2 :(得分:2)
在Hibernate中,no-arg构造函数用于通过Reflection加载数据库实体(用于在运行时检查或修改应用程序行为)。
答案 3 :(得分:2)
默认无参数构造函数的实现,不是必需的,即使对于Hibernate
也是如此,因为java会自动且隐含地管理它。
当您声明另一个参数化构造函数时,唯一需要指定它的情况是。
如果您查看 to documentation ,您会看到:
每个类至少有一个构造函数。有两种情况:
如果您没有为类编写构造函数,Java会生成一个构造函数 对于 您。生成的构造函数称为默认构造函数。它' S 在您的代码中不可见,但它只是一样。如果你可以 看到它,它看起来像这样(对于班级狗): public Dog(){}请注意,此默认构造函数不带参数,并且具有不执行任何操作的主体。
- 醇>
如果您为类编写构造函数,则Java不会生成 一个 默认构造函数。如果您已预先存在,这可能是一个问题 使用默认构造函数的代码。
答案 4 :(得分:2)
如果您没有定义任何构造函数,编译器将生成默认构造函数,如JLS中所述:
如果类不包含构造函数声明,则为默认值 没有形式参数且没有throws子句的构造函数 隐含地宣布。
如果声明的类是原始类Object,那么 默认构造函数有一个空体。否则,默认 构造函数只调用没有的超类构造函数 参数。
这意味着您不必为Hibernate实体显式实现no-arg构造函数,只要:
throws
子句用于任何已检查的异常。答案 5 :(得分:0)
Java类可能没有隐式默认构造函数。 假设你有这样一个类:
public class A {
public A(String st) {}
}
最终唯一的构造函数是A(String st),而不是A(String st)和A()。