hibernate Null value was assigned to a property of primitive type setter


问题描述:Null value was assigned to a property of primitive type setter  ,hibernate int型数据无法读取 hiberante读int 整型数据出错 hiberante读数据库出错 
 

错误日志:

Exception in thread "main" org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.zsba.AdornCompanyInfo.provinceOrderMember
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:85)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3560)
    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
    at org.hibernate.loader.Loader.doQuery(Loader.java:717)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:1851)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3038)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
    at $Proxy0.get(Unknown Source)
    at com.zsba.HibernateUtil.main(HibernateUtil.java:60)
Caused by: java.lang.IllegalArgumentException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
    ... 26 more

解决办法:

javabean.hbm.xml 

  <property name="provinceOrderMember" type="int">
            <column name="provinceOrderMember">
                <comment></comment>
            </column>
        </property>
type="int" 改为type="java.lang.Integer"

javabean

    private int provinceOrderMember; 改为private Intege provinceOrderMember


原因:数据库字段值为NULL,int 类型不能赋值为NULL,只能为0,但有些实际应用中,如学生分数,0表示0分,NULL,则表示暂无分数所以,要不设数据字段不为NULL,要不就是用Integer.

其实你只要想一下java代码中int long等8个基本类型是不能设置为null的,而String,Integer等引用类型是可以设置为null的,这样容易记住。

原地址:http://blog.csdn.NET/ydcun/article/details/7584153

<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"); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值