org.hibernate.StaleStateException报错

本文详细解析了在使用Spring框架和Hibernate ORM时遇到的乐观锁异常问题,具体表现为Batch updater返回了意外的行数,实际行数为0,期望行数为1。探讨了异常的根本原因,并给出了相应的解决方案。

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

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:675)
	org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
	org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
	org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:412)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
	com.qq.service.StudentService$$EnhancerByCGLIB$$56df6193.updateStudent(<generated>)
	com.qq.action.StudentAction.updateStudent(StudentAction.java:190)

.............................

root cause

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
	org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
	org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(Hibern.......
错误原因:Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
这个异常是由于主键设置为自增长,而在我们插入记录的时候设置了ID的值导致的。看下我的Hibernate映射文件中ID的定义
<think>我们分析问题:用户将region.factory_class换成了org.hibernate.cache.ehcache.EhCacheRegionFactory后报错,提示无法加载该类。 可能的原因及解决方案如下: 1. **依赖缺失**:项目中没有添加Ehcache的Hibernate集成依赖。 解决方案:添加Ehcache和Hibernate-Ehcache整合的依赖。 例如,在Maven项目中添加: ```xml <!-- Ehcache 核心库 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.9.2</version> <!-- 版本根据实际选择 --> </dependency> <!-- Hibernate对Ehcache的支持 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.6.14.Final</version> <!-- 版本需与Hibernate核心一致 --> </dependency> ``` 2. **版本不兼容**:使用的Ehcache版本与Hibernate版本不兼容。 解决方案:检查版本兼容性,确保hibernate-ehcache的版本与Hibernate核心版本一致。 3. **类名错误**:确认类名是否正确。注意,Ehcache有两种RegionFactory: - `org.hibernate.cache.ehcache.EhCacheRegionFactory` (用于Ehcache 2.x) - `org.hibernate.cache.ehcache.internal.EhcacheRegionFactory` (用于Ehcache 3.x,但Hibernate 5.3+支持) 在Ehcache 2.x中,使用`org.hibernate.cache.ehcache.EhCacheRegionFactory`是正确的。 4. **Ehcache 3.x的配置**:如果使用Ehcache 3.x,则需要不同的依赖和配置: 依赖: ```xml <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.9.7</version> </dependency> <!-- Hibernate对Ehcache3的支持 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jcache</artifactId> <version>5.6.14.Final</version> </dependency> ``` 配置:此时应该使用JCacheRegionFactory,并指定Ehcache的CachingProvider: ```yaml hibernate.cache.region.factory_class: jcache hibernate.javax.cache.provider: org.ehcache.jsr107.EhcacheCachingProvider ``` 5. **类加载问题**:在复杂的类加载环境中(如OSGi、某些应用服务器),可能需要额外的类加载配置。 6. **依赖冲突**:项目中可能存在多个缓存提供者的冲突,需要排除冲突的依赖。 针对用户情况,如果使用的是Ehcache 2.x,则重点检查依赖是否添加,版本是否匹配。 示例配置(application.yml): ```yaml spring: jpa: properties: hibernate: cache: region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory use_second_level_cache: true # 可选:指定Ehcache配置文件位置 # net.sf.ehcache.configurationResourceName: ehcache.xml ``` 注意:如果使用Ehcache 2.x,默认会查找类路径下的`ehcache.xml`,如果没有则使用默认配置。 因此,回答应包含以上可能原因和解决方案,并在最后提出相关问题。</think>### 解决 `EhCacheRegionFactory` 类加载错误 当切换为 `org.hibernate.cache.ehcache.EhCacheRegionFactory` 后出现类加载错误,通常由以下原因导致: #### 核心原因分析 1. **依赖缺失** (最常见原因): - 未添加 Ehcache 与 Hibernate 的集成依赖 - 错误版本依赖(如使用 Ehcache 3.x 但配置了 2.x 的类名) 2. **版本不兼容**: - Hibernate 5.4+ 默认不再包含 `hibernate-ehcache` 模块 - Ehcache 3.x 需改用 JCache 标准接口 #### 解决方案步骤 **1. 添加正确依赖(Maven示例)** ```xml <!-- Ehcache 2.x 方案(传统集成) --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.6.15.Final</version> <!-- 需匹配Hibernate核心版本 --> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.9.2</version> </dependency> <!-- Ehcache 3.x 方案(JCache标准) --> <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jcache</artifactId> <version>5.6.15.Final</version> </dependency> ``` **2. 检查版本兼容性** | Hibernate 版本 | 推荐 Ehcache 方案 | RegionFactory 类名 | |----------------|--------------------------|--------------------------------------------| | 5.0-5.3 | Ehcache 2.x | `org.hibernate.cache.ehcache.EhCacheRegionFactory` | | 5.4+ | Ehcache 3.x + JCache | `org.hibernate.cache.jcache.JCacheRegionFactory` | **3. 配置修正(Ehcache 3.x示例)** ```yaml spring: jpa: properties: hibernate: cache: region.factory_class: org.hibernate.cache.jcache.JCacheRegionFactory use_second_level_cache: true javax: cache: provider: org.ehcache.jsr107.EhcacheCachingProvider ``` #### 验证方法 在应用启动时检查日志: ``` DEBUG o.h.c.e.EhCacheRegionFactory - Starting Ehcache region factory ``` 而非 ``` ERROR o.h.b.c.ClassLoaderService - Unable to load class [org.hibernate.cache.ehcache.EhCacheRegionFactory] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值