Null value was assigned to a property of primitive type setter of"原因及解决方法

本文探讨了在使用Hibernate框架时遇到的“Nullvaluewasassignedtoapropertyofprimitivetypesetterof”错误,并提供了三种解决方案,包括调整数据库字段设置、修改映射文件以及在反向工程时选择合适的类型。

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

    在action请求数据的过程中报出"Null value was assigned to a property of primitive type setter of"错误,搜索之后发现是因为数据库里相应的字段为NULL。

例如:

Java代码  

<!--Hibernate映射文件中的字段--> 

<property name="printTime" type="long"><column name="print_time"/></property> 

[java] view plain copy print?

  1. <!--Hibernate映射文件中的字段-->  

  2. <property name="printTime" type="long"><column name="print_time"/></property>  

其中的类型为hibernate类型,在生成的类中,printTime字段为long类型,为基本类型,不能为NULL.
解决方法:
    第一种:数据库字段不设置为空;
    第二种:手动修改映射文件,printTime使用Java类型Long,即type="java.lang.Long",Book类中的字段也要改为Long。同理,int为Integer.
    第三种:在反向工程时使用Java类型,而不是hibernate类型。


<think>好的,用户现在遇到了两个问题:一个是Hibernate在给DepartmentEntity的latin属性赋值null导致异常,另一个是departmentCacheProvider的bean创建失败。我需要结合之前的对话和用户提供的引用来分析。 首先,用户之前提到过departmentCacheProvider的bean创建失败,之前的回答已经涵盖了配置检查、依赖注入、缓存加载等问题。现在用户可能是在解决这个bean问题的同时遇到了另一个实体类的问题,或者这两个问题有关联? 用户这次的问题中,引用了Hibernate和JPA的内容,提到使用@Entity注解让Hibernate将对象持久化到数据库。但用户当前的错误是关于DepartmentEntity.latin属性的null值被赋给基本类型,导致HibernateSystemException,同时还有departmentCacheProvider的bean创建错误。 首先需要明确这两个错误是否有联系。可能的情况是,departmentCacheProvider在初始化时可能依赖于DepartmentEntity的数据,当Hibernate无法正确创建实体时,导致缓存加载失败,从而bean创建失败。或者这两个问题独立存在,需要分别处理。 对于Null value assigned to primitive type的问题,常见于实体类中使用了基本类型(如int、long)的属性,而数据库对应的字段允许为NULL。当Hibernate尝试将NULL赋值给基本类型时,会抛出异常,因为基本类型不能为null解决方法是将属性改为包装类型(如Integer、Long)或者在映射中设置默认值。 接下来,检查用户提到的DepartmentEntity.latin属性。如果latin是基本类型(比如long),而数据库中的对应列允许NULL,就会导致这个问题。需要查看实体类的定义,确认属性的类型是否正确,是否为包装类型。同时,检查数据库表结构,确保列是否允许NULL,是否与实体类定义一致。 关于departmentCacheProvider的bean创建错误,用户之前已经有过一次解答,现在可能是在解决了Hibernate的问题后,缓存加载依然失败,或者这两个错误同时存在。需要确认缓存配置是否正确,特别是缓存是否在加载时访问了数据库中的DepartmentEntity数据,如果实体类存在问题导致数据无法正确加载,也可能导致缓存初始化失败。 此外,用户可能没有正确配置Hibernate或JPA,导致实体类映射错误,进而影响缓存初始化。需要检查Hibernate的配置,比如hibernate.ddl-auto是否设置为update或validate,是否有正确的方言配置,以及实体类是否被正确扫描。 可能的解决步骤: 1. 将DepartmentEntity中的latin属性从基本类型改为包装类型,例如Long改为long可能会出问题,应使用Long。 2. 检查数据库表的latin列是否允许NULL,如果业务上不允许,需要修改实体类为@Column(nullable = false),并确保数据库中有默认值或应用层处理。 3. 如果必须使用基本类型,可以在属性上添加@ColumnDefault或Hibernate的@Type注解来设置默认值。 4. 检查Hibernate的配置,确保实体类被正确扫描,没有映射错误。 5. 查看departmentCacheProvider的初始化方法,确认是否在加载缓存时执行了数据库查询,如果查询因实体类问题失败,需要解决实体类问题后缓存才能正确加载。 6. 检查Spring的依赖注入,确保cacheManager和相关bean正确配置,版本兼容,特别是Ehcache和Spring的版本是否匹配。 7. 查看日志,确定具体的异常堆栈,确认是Hibernate映射问题先发生,还是缓存bean初始化先失败,以确定问题的主次。 用户可能没有注意到实体类中的基本类型与数据库NULL的冲突,或者缓存加载过程中依赖的DAO或Service层因为实体类问题抛出异常,导致缓存初始化失败。需要综合处理这两个问题,可能先解决实体类的映射问题,再处理缓存bean的创建问题。</think>针对您遇到的`Null value assigned to primitive type`异常和`departmentCacheProvider`的Bean创建失败问题,以下是系统性解决方案: --- ### 一、`HibernateSystemException`根本原因分析 当实体类属性为**基本数据类型**(如`long`/`int`)而数据库对应字段为`NULL`时,Hibernate无法将`NULL`赋值给基本类型,导致异常。例如: ```java @Entity public class DepartmentEntity { @Column(name = "latin_code") private long latin; // 错误!基本类型无法接受NULL } ``` --- ### 二、问题分步解决 #### 步骤1:修正实体类数据类型 将基本类型改为**包装类型**(如`Long`): ```java @Column(name = "latin_code") private Long latin; // 正确!包装类型允许NULL ``` - **验证点**:数据库表`latin_code`字段是否允许`NULL`(需与`@Column(nullable = true)`一致) #### 步骤2:添加默认值保护 若必须保持基本类型,通过Hibernate注解设置默认值: ```java @Column(name = "latin_code", nullable = false) @ColumnDefault("0") // Hibernate专用注解 private long latin; // 当数据库值为NULL时自动填充0 ``` #### 步骤3:检查DDL自动生成配置 在`application.properties`中确认Hibernate模式: ```properties spring.jpa.hibernate.ddl-auto=validate # 验证实体与表结构一致性 spring.jpa.show-sql=true ``` - **关键作用**:防止实体类与数据库表结构不匹配[^1] --- ### 三、`departmentCacheProvider` Bean创建失败关联分析 缓存加载失败可能与实体类错误存在间接关联: 1. **场景假设**:缓存初始化时需加载`DepartmentEntity`数据 2. **故障链**: `实体类映射错误` → `DAO层查询失败` → `缓存加载方法异常` → `Bean初始化失败` #### 验证手段:添加调试日志 在缓存加载方法中捕获异常: ```java public class DepartmentCacheProvider { public void loadUserCache() { try { List<DepartmentEntity> departments = departmentDao.findAll(); // 可能在此处触发Hibernate异常 // ...缓存加载逻辑 } catch (PersistenceException e) { logger.error("数据库查询失败", e); // 定位是否由实体类问题引发 } } } ``` --- ### 四、综合配置检查清单 #### 1. Hibernate依赖验证 确认`pom.xml`包含JPA实现: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` #### 2. 缓存配置交叉验证 检查Ehcache定义是否包含部门缓存: ```xml <!-- ehcache.xml --> <cache name="departmentCache" maxEntriesLocalHeap="1000" eternal="false" timeToIdleSeconds="300"/> ``` #### 3. Bean初始化顺序控制 通过`@DependsOn`确保缓存加载在实体管理器之后: ```java @Bean @DependsOn("entityManagerFactory") public DepartmentCacheProvider departmentCacheProvider() { return new DepartmentCacheProvider(); } ``` --- ### 五、典型错误日志分析 观察控制台输出的关键信息: 1. `org.hibernate.PropertyAccessException`:明确指示属性赋值失败 2. `Caused by: java.lang.IllegalArgumentException`:具体说明`null`赋值给`long`类型 3. `BeanCreationException: Error creating bean with name 'departmentCacheProvider'`:查看嵌套异常链 --- ### 六、扩展优化建议 1. **DTO模式**:在数据访问层使用DTO隔离实体类,避免直接暴露持久化细节 2. **全局异常处理**:添加`@ControllerAdvice`捕获`DataAccessException` 3. **集成测试**:编写测试验证缓存加载流程: ```java @SpringBootTest public class DepartmentCacheTest { @Autowired private DepartmentCacheProvider cacheProvider; @Test void testCacheLoading() { assertDoesNotThrow(() -> cacheProvider.loadUserCache()); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值