Java Spring Boot中使用@Entity注解是否必须提供无参构造函数?
结论
@Entity实体必须提供无参构造是JPA的强制要求,你当前场景未触发报错是两个特殊前提叠加的结果。
1. 你当前未显式写无参构造也符合要求的原因
Java编译器会为没有显式声明任何构造函数的类自动生成一个public的默认无参构造函数,你给出的Person类没有定义任何构造,所以实际运行时是存在符合JPA要求的无参构造的。
2. 为什么建表阶段哪怕没有无参构造也不会报错
Hibernate生成数据表的阶段只需要扫描解析实体类的注解、字段元信息生成DDL语句,不需要实例化实体对象,所以只要不涉及实体的CRUD操作,就算你真的没有无参构造,建表也不会失败。
你可以做个简单测试验证:
- 给Person类新增一个自定义带参构造,此时Java不会再生成默认无参构造
- 新增PersonRepository接口继承JpaRepository<Person, String>,在启动类中注入Repository调用
personRepository.findAll()方法 - 启动应用会直接抛出
InstantiationException: No default constructor for entity异常。
3. 规范补充说明
JPA要求实体的无参构造可见性至少为protected,保证JPA实现可以通过反射调用实例化对象。日常开发中如果使用Lombok,可以直接加@NoArgsConstructor注解快速生成,避免手动遗漏。
相关代码参考
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); } }
H2控制台表展示

内容的提问来源于stack exchange,提问作者PolamreddyVivekReddy
相关产品推荐
相关产品推荐

