2015-09-08 246 views
2

正如我们可以读到的here Hibenate对于所有的@Entity类都需要no-arg构造函数。但是,即使我们没有明确地声明一个,java类总是隐式默认构造函数是不是真的?休眠和无参数构造函数

在我的项目中,我没有在我的@Entity类中声明无参数构造函数,并且eveything正常工作。但另一方面,我想Hibernate规范已经被仔细地写过了,所以也许实际声明默认的构造函数可能有一些好处?

回答

3

明确定义无参数的构造为实体类的没有什么特别的好处(但是请记住,Hibernate框架内部使用无参数的构造通过Java反射API来填充实体)。

这是强制性的,Hibernate的实体bean类需要无参数的构造函数,可以明确地由程序员(或自动通过Java的产生)来定义。

很重要的一点是,当你定义自己的类构造函数(S),你需要自行提供无参数的构造(因为编译器不会在这种情况下提供)。

8

如果您创建其他构造函数,java将不会创建隐式构造函数。

0

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

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

最终,唯一的构造将是A(线St),而不是A(线St)和A()。

2

在Hibernate中,无参数的构造是通过反射来装载数据库实体(即用于检查或在运行时修改应用行为)。

2

执行默认无参数构造函数并非强制即使对于Hibernate,因为java会自动隐式地管理它。

并且当您声明另一个参数化构造函数时,您需要指定它的唯一情况是

如果你看一看The No-Arg Constructor,你会发现:

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

  1. 如果你不写一个构造一类,Java的生成 你一个 。这个生成的构造函数被称为默认构造函数。这是 在您的代码中不可见,但它在那里是一样的。如果你能看到 它,它看起来像这样(为类犬): 公狗(){}注意,这个默认的构造函数没有参数,对身体,什么也不做。

  2. 如果您为您的类编写构造函数,Java不会生成默认构造函数 a 。如果您有预先存在的 使用默认构造函数的代码,则可能会出现问题。

2

如果不定义任何构造函数,编译器将生成默认的,如JLS描述:如果一个类不包含任何构造函数声明,则将默认

没有正式参数且没有抛出子句的构造函数是隐式声明的 。

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

这意味着,你不必,只要明确实施一个Hibernate实体的无参数的构造函数:

  1. 您不必在实体类中的任何其他构造;
  2. 对于任何检查的异常,扩展超类都有一个无参数构造函数,没有throws子句。
+0

+ for the 2nd。异常将被抛出,因为在扩展时,super()被调用哪个ofc调用no-arg构造函数 – pzeszko