JPA实体类无默认构造方法报错问题求助
解决Hibernate InstantiationException:实体类缺少无参构造函数
你遇到的org.hibernate.InstantiationException: No default constructor for entity: com.example.TallerJPA.model.IcesiUser异常,根源是JPA实体类IcesiUser缺少Hibernate实例化对象所需的无参构造函数。
问题原因
JPA规范强制要求所有实体类必须提供无参构造函数——Hibernate在执行数据库查询、映射实体实例时,会通过反射调用无参构造来创建对象实例。
你的代码中:
- 使用了Lombok的
@Builder注解,该注解会自动生成一个全参构造函数; @Data注解并不包含自动生成无参构造的逻辑(@Data等价于@Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode,其中@RequiredArgsConstructor仅生成包含final/@NonNull字段的构造函数)。
当类中存在显式的全参构造函数时,Java不会自动生成默认的无参构造,这就导致Hibernate无法实例化IcesiUser实体,进而抛出异常。
解决方案
在IcesiUser类上同时添加@NoArgsConstructor和@AllArgsConstructor注解,配合已有的@Builder和@Data使用:
@Builder @Data @Entity @NoArgsConstructor @AllArgsConstructor public class IcesiUser { @Id private UUID userId; private String firstName; private String lastName; private String email; private String phoneNumber; private String password; @OneToMany(mappedBy = "user") private List<IcesiAccount> accounts; @ManyToOne @JoinColumn(name = "icesi_role_role_id") private IcesiRole role; }
@NoArgsConstructor:生成无参构造函数,满足Hibernate的实例化要求;@AllArgsConstructor:生成全参构造函数,供@Builder内部调用;- 三者搭配可同时保留Builder模式的便捷性,又完全符合JPA的实体规范。
你之前尝试添加@Getter/@Setter无效,是因为问题核心不在属性访问器,而是构造函数缺失;手动编写Builder出错,大概率是没有同时维护好无参构造和全参构造的一致性。
内容的提问来源于stack exchange,提问作者Mateo Rada
相关产品推荐
相关产品推荐

