You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:42:53