【问题标题】:Is it mandatory to use no args constructor using @entity annotation in java spring boot?java spring boot中是否必须使用@entity注解不使用args构造函数?
【发布时间】:2021-11-04 01:01:07
【问题描述】:

我正在开发一个 spring boot 应用程序 (v2.1.5.RELEASE),其中 h2 作为内存数据库。我创建了一个简单的项目,其中只有一个模型 Person.java,其中只有 3 个 private 字段。我根本没有没有构造函数,但是当我启动应用程序并打开 h2 控制台时,我仍然能够看到从实体 Person 创建的表。我从SO question 中读到,当我们使用 @entity 注释时,需要一个 no-args 构造函数。是强制性的吗?

Person.java

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Person {

    @Id
    private String name;

    private double age;

    private String dateOfBirth;

}

主类

@SpringBootApplication
public class CommandLineApp {

    public static void main(String[] args) {

        SpringApplication.run(CommandLineApp.class);

    }
}

image-h2-console-showing-table

【问题讨论】:

  • 不指定任何构造函数时,会隐式添加无参数构造函数。
  • @CodeSlave,事实上,我从那个特定问题中看到,实体类必须使用无参数构造函数,但我能够看到在我的 h2 控制台中创建的表,而我的实体类中没有任何构造函数.我想如果实体的无参数构造函数和 h2 创建表之间存在某种联系。

标签: java spring-boot jpa


【解决方案1】:

当没有定义构造函数时,Java 会为所有类隐式添加一个无参数构造函数。如果定义任何参数化构造函数,则不会添加无参数构造函数。

根据另一个 SO question,必须有无参数构造函数来初始化实体。

所以这里的行为是完美的。

【讨论】:

  • 您是否从 DDL 中检查过该表是否会自动创建(如果不存在)?
【解决方案2】:

模式的创建与 Java 构造函数无关。 Spring 和 ORM 供应商可以使用反射读取 java 字段,还可以考虑从注解提供的元信息。

构造函数只是用来创建java实例。

我根本没有构造函数,但是当我启动应用程序并 打开 h2 控制台,我仍然可以看到从 实体人

表格是根据我上面提到的所有信息创建的。与构造函数无关

关于你的第二个问题

当我们使用@entity 注解时,需要一个无参数的构造函数。是吗 强制性的?

这与 ORM 供应商如何制作框架以及他对其工作的要求有关。专门针对 Hibernate 是的,它是强制性的

取自Hibernate Doc

2.2。实体Java类

  • 无参数构造函数也是 JavaBean 约定,是所有持久类的要求。 Hibernate需要创建 对象,使用 Java 反射。构造函数可以是 私人的。但是,运行时需要包或公共可见性 无需字节码的代理生成和高效数据检索 仪表。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2020-07-12
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多