繁体   English   中英

Hibernate和no-arg构造函数

[英]Hibernate and no-arg constructor

正如我们在这里可以看到的 Hibenate需要所有@Entity类的no-arg构造函数。 但是,即使我们没有明确声明一个,java类总是隐式默认的构造函数不是真的吗?

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

如果创建其他构造函数,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构造函数 ,你会看到:

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

  1. 如果您没有为类编写构造函数,Java会为您生成一个构造函数。 生成的构造函数称为默认构造函数。 它在您的代码中不可见,但它就是一样的。 如果你能看到它,它看起来像这样(对于类Dog):public Dog(){}注意这个默认构造函数不带参数,并且有一个什么都不做的主体。

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

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

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

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

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

  1. 实体类中没有任何其他构造函数;
  2. 对于任何已检查的异常,扩展超类都有一个没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM