当前位置: 首页 > 知识库问答 >
问题:

在java spring boot中使用@entity注释是否必须使用无参数构造函数?

郝杰
2023-03-14

我正在开发一个Spring Boot应用程序(v2.1.5版本),其中h2是内存数据库。我创建了一个简单的项目,主要和只有一个模型人。java只有3个私有字段。我根本没有构造函数,但当我启动应用程序并打开h2控制台时,我仍然能够看到从实体Person创建的表。我从一个SO问题中读到,当我们使用@entity注释时,需要一个无参数构造函数。它是强制性的吗?

人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);

    }
}

共有2个答案

暴奕
2023-03-14

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

构造函数仅用于创建java实例。

我根本没有构造函数,但当我启动应用程序并打开h2控制台时,我仍然能够看到从实体Person创建的表

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

至于你的第二个问题

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

这与ORM供应商如何制定框架以及为使其工作所做的要求有关。特别是对于Hibernate是的,它是强制性的。

从Hibernate文档检索

2.2. 实体Java类

  • 无参数构造函数也是JavaBean约定,是所有持久类的要求。Hibernate需要使用Java反射为您创建对象。构造函数可以是私有的。然而,在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性
轩辕季同
2023-03-14

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

根据另一个SO问题,必须使用无参数构造函数来初始化实体。

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

 类似资料:
  • Gson用户指南指出,我们应该为任何类定义默认的无参数构造函数,以便正确使用Gson。更重要的是,在Gson的类的javadoc中说,如果我们试图反序列化缺少默认构造函数的类的实例,将引发异常,在这种情况下,我们应该使用。然而,我已经尝试在缺少默认构造函数的类中测试使用Gson,并且序列化和反序列化都可以顺利工作。 下面是反序列化的一段代码。没有非参数构造函数的类: 还有一个测试: 这很好用。 所

  • 问题内容: Gson用户指南指出,我们应该为任何可以正常使用Gson的类定义默认的无参数构造函数。甚至,在Gson 类的javadoc中说,如果我们尝试对缺少默认构造函数的类实例进行反序列化,则会抛出异常,在这种情况下 应 使用该异常。但是,我尝试对缺少默认构造函数的类使用Gson进行测试,并且序列化和反序列化工作都没有任何麻烦。 这是反序列化的代码。没有非参数构造函数的类: 和一个测试: 效果很

  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 问题内容: 在Jackson中,当用注释构造函数时,必须用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。

  • 问题内容: Gson用户指南指出,我们应该为任何可以正常使用Gson的类定义默认的无参数构造函数。更重要的是,在Gson 类的javadoc中说,如果我们尝试对缺少默认构造函数的类实例进行反序列化,则会抛出异常,并且在这种情况下应使用该异常。但是,我尝试对缺少默认构造函数的类使用Gson进行测试,并且序列化和反序列化工作都没有任何麻烦。 这是反序列化的代码。没有非参数构造函数的类: 和一个测试:

  • 这个Super()的替代品是什么;我代码中的语句...因为它向我显示了一个名为:构造函数调用必须是构造函数中的第一个语句的错误。