我正在开发一个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);
}
}
模式的创建与Java构造函数无关。Spring和ORM供应商可以使用反射读取java字段,还可以考虑注释提供的元信息。
构造函数仅用于创建java实例。
我根本没有构造函数,但当我启动应用程序并打开h2控制台时,我仍然能够看到从实体Person创建的表
这个表是根据我上面提到的所有信息创建的。与构造函数无关
至于你的第二个问题
当我们使用@实体注释时,需要一个无参数构造函数。它是强制性的吗?
这与ORM供应商如何制定框架以及为使其工作所做的要求有关。特别是对于Hibernate是的,它是强制性的。
从Hibernate文档检索
2.2. 实体Java类
当没有定义构造函数时,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()的替代品是什么;我代码中的语句...因为它向我显示了一个名为:构造函数调用必须是构造函数中的第一个语句的错误。