Hibernate和no-arg构造函数

时间:2015-09-08 21:26:57

标签: java hibernate

我们可以阅读here Hibenate要求所有@Entity类都使用no-arg构造函数。但是,即使我们没有明确地声明一个默认的构造函数,java类也始终是隐式默认构造函数吗?

在我的项目中,我没有在我的@Entity课程中声明一个无参数的构造函数,并且eveything正常工作。但另一方面,我认为Hibernate规范已经仔细编写,所以实际上可能会明确声明默认构造函数可能有一些好处吗?

6 个答案:

答案 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 ,您会看到:

  

每个类至少有一个构造函数。有两种情况:

     
      
  1. 如果您没有为类编写构造函数,Java会生成一个构造函数   对于   您。生成的构造函数称为默认构造函数。它' S   在您的代码中不可见,但它只是一样。如果你可以   看到它,它看起来像这样(对于班级狗):    public Dog(){}请注意,此默认构造函数不带参数,并且具有不执行任何操作的主体。

  2.   
  3. 如果您为类编写构造函数,则Java不会生成   一个   默认构造函数。如果您已预先存在,这可能是一个问题   使用默认构造函数的代码。

  4.   

答案 4 :(得分:2)

如果您没有定义任何构造函数,编译器将生成默认构造函数,如JLS中所述:

  

如果类不包含构造函数声明,则为默认值   没有形式参数且没有throws子句的构造函数   隐含地宣布。

     

如果声明的类是原始类Object,那么   默认构造函数有一个空体。否则,默认   构造函数只调用没有的超类构造函数   参数。

这意味着您不必为Hibernate实体显式实现no-arg构造函数,只要:

  1. 实体类中没有任何其他构造函数;
  2. 扩展超类的no-arg构造函数没有throws子句用于任何已检查的异常。

答案 5 :(得分:0)

Java类可能没有隐式默认构造函数。 假设你有这样一个类:

public class A {
    public A(String st) {}
}

最终唯一的构造函数是A(String st),而不是A(String st)和A()。