Caused by: org.hibernate.AssertionFailure: collection owner not associated with

本文解决了一个在使用Hibernate框架时遇到的具体问题:当尝试保存对象时出现了collection owner not associated with session的异常。问题发生在对数据库对象进行操作并尝试复制集合后,解决方案是使用evict方法清除缓存的session。

Caused by: org.hibernate.AssertionFailure: collection owner not associated with session

 

[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R Caused by: org.hibernate.AssertionFailure: collection owner not associated with session: com.shkco.adsr3.cbm.vo.SubAccount.authorizors
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at org.hibernate.engine.internal.Collections.processDereferencedCollection(Collections.java:105)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at org.hibernate.engine.internal.Collections.processUnreachableCollection(Collections.java:66)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at org.hibernate.event.internal.AbstractFlushingEventListener.flushCollections(AbstractFlushingEventListener.java:248)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:101)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1240)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at com.shkco.adsr3.framework.dao.SessionWrapper.flush(SessionWrapper.java:209)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at com.shkco.adsr3.framework.dao.AbstractDAO.saveAll(AbstractDAO.java:230)
[13/01/16 11:14:47:779 CST] 00000127 SystemErr     R 	at com.shkco.adsr3.framework.dao.AbstractDAO.saveAll(AbstractDAO.java:212)

 

save vo 的报以上错误。。。

因为对db对象做了操作

Set<IAddress> addressSet = (Set<IAddress>)ObjectUtil.deepCopy(tempAddressSet);

造成session不一致,所以在对象改变之后使用evict方法清除一下缓存session。

 

subAccountService.evict(subAccount);

`Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet` 这个错误通常出现在 Hibernate 框架中,表示在尝试从数据库提取结果集 (`ResultSet`) 的过程中发生了 SQL 语法错误。以下是可能导致该问题的原因及其解决方法: --- ### **常见原因及解决办法** #### **1. 数据库表或字段名称拼写错误** 如果在 Hibernate 配置文件(如 `.hbm.xml` 文件)或实体类注解中定义的表名或字段名与实际数据库中的表结构不符,就会引发此问题。 **解决方案**: - 确保实体类中标记的 `@Table(name="...")` 和 `@Column(name="...")` 中的名称完全匹配数据库的实际表和字段名称。 - 注意区分大小写规则:某些数据库(如 MySQL 默认不区分大小写),而其他数据库(如 PostgreSQL 或 Oracle 则严格区分)。 示例: ```java @Entity @Table(name = "users") public class User { @Id @Column(name = "user_id") private Long id; @Column(name = "username", nullable = false) private String username; } ``` --- #### **2. HQL/JPQL 查询语法错误** Hibernate 使用的是类似于 SQL 的查询语言(HQL 或 JPQL),但如果编写有误,也可能导致无法解析为有效的 SQL 并抛出类似异常。 **解决方案**: - 认真检查你的 HQL 或 JPQL 是否存在语法错误。 - 尝试将 HQL 转换为原生 SQL 来验证其正确性。 示例: ```java Query<User> query = session.createQuery( "FROM User u WHERE u.username = :name", User.class); query.setParameter("name", "testUser"); List<User> users = query.list(); ``` 确保这里的 `"FROM User"` 对应于正确的实体类别名。 --- #### **3. 数据库驱动版本不兼容** 当使用的 JDBC 驱动程序版本较旧或者与当前数据库系统版本不适配时,也可能会出现这种错误。 **解决方案**: - 升级至最新版的支持相应数据库类型的 JDBC 驱动包; - 在项目依赖管理工具 (Maven / Gradle) 中明确指定所需的 driver 版本号。 对于 Maven 用户来说,在 pom.xml 添加适当的 dependency 声明即可完成引入新 Driver 包的任务: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.XX</version><!-- 替换成合适的具体数字 --> </dependency> ``` --- #### **4.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值