org.springframework.orm.jpa.JpaSystemException: No default constructor for entity

本文解决了一个在SpringBoot项目中使用JpaRepository进行测试时遇到的问题:No default constructor for entity。问题的根源在于实体类LikeInfo缺少默认的无参构造函数。解决方法是在LikeInfo类中添加一个空的构造方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发springboot+JpaRepository:

测试出现异常:

org.springframework.orm.jpa.JpaSystemException: No default constructor for entity

解决方法:

给被测试相关类添加一个空的构造方法:

例如我的类是LikeInfo

class LikeInfo{

    public LikeInfo(){}

}

<think>嗯,用户遇到了Spring JPA中向基本类型属性设置空值导致的JpaSystemException异常。这个问题应该怎么解决呢?首先,我得回忆一下Java的基本类型和它们的包装类之间的区别。基本类型比如int、boolean等不能为null,而它们的包装类Integer、Boolean可以。如果数据库中的某个字段允许为NULL,而对应的实体类属性是基本类型,当Hibernate尝试将NULL赋值给这个属性时,就会抛出异常,因为无法将null赋给基本类型。 那解决方法应该就是把实体类中的基本类型改为对应的包装类。比如,把int改成Integer,boolean改成Boolean。这样,当数据库中的值为NULL时,Hibernate就可以正确地将null赋值给包装类属性,而不会导致异常。 另外,可能还需要检查实体类的注解,比如@Column,确认是否设置了nullable = true,但如果是基本类型的话,这个设置可能不起作用,因为基本类型默认不能为null。所以必须用包装类。 还有,用户可能需要检查数据库表的结构,确保对应的字段确实允许NULL,或者是否有默认值。如果数据库不允许NULL,但实体类用了包装类,可能也会有问题,不过这时候错误可能不同。所以重点还是实体类属性类型是否正确。 另外,是否有其他情况会导致这个问题?比如使用@Version注解的字段,如果用了基本类型,同样会有这个问题。或者在某些继承策略中,子类的属性覆盖了父类的基本类型属性,也可能引发异常。这些情况都需要考虑。 总结下来,解决方案主要是将基本类型替换为包装类,并确保数据库和实体类定义一致。可能还需要检查相关的注解配置,确保Hibernate能正确处理NULL值。</think>### 解决Spring JPA中空值赋给基本类型导致的异常 #### 问题分析 当实体类中定义**基本类型属性**(如$int$, $boolean$)时,若从数据库查询到对应字段为`NULL`,Hibernate尝试通过反射调用`setter`方法赋值会抛出`JpaSystemException`,具体表现为: ``` org.springframework.orm.jpa.JpaSystemException: Null value assigned to a primitive type setter ``` 根本原因是基本类型无法接受`null`值,而包装类型(如$Integer$, $Boolean$)可以[^1]。 --- #### 解决方案 ##### 1. 修改实体类属性类型(推荐) 将基本类型替换为对应的**包装类型**: ```java // 修改前(错误示例) private int isSign; // 修改后(正确示例) private Integer isSign; ``` ##### 2. 添加默认值(需谨慎) 在实体类中为基本类型赋予默认值: ```java private int isSign = 0; // 当数据库为NULL时使用0替代 ``` ##### 3. 数据库层约束 通过`@Column`注解强制字段非空(需与数据库约束一致): ```java @Column(nullable = false) private int isSign; ``` --- #### 原理解释 1. Hibernate通过反射调用属性的`setter`方法时,若字段值为`NULL`: - 包装类型:可接受`null` - 基本类型:触发`IllegalArgumentException`,最终封装为`PropertyAccessException` 2. 修改为包装类型后,Hibernate能正确处理`NULL`值,避免类型不匹配问题[^2]。 --- #### 扩展验证 可通过`@PrePersist`或`@PreUpdate`回调方法实现空值拦截: ```java @PrePersist public void validateFields() { if (isSign == null) { throw new IllegalArgumentException("isSign cannot be null"); } } ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值