转自:http://hi.baidu.com/dmworld_2012/blog/item/238c40936d7fa394a877a443.html
原因相信大家都知道,因为在hibernate中同一个session里面有了两个相同标识
但是是不同实体,当这时运行saveOrUpdate(object)操作的时候就会报这个错误。
呵呵,也许你会说,你这么说跟没说没什么区别,我承认,呵呵,我不知道具体
为什么会产生这个错误,要不然也不会很久都没有解决,现在,给出一个临时的
解决方案,给向我一样,没有办法找到根源的人一个能够继续执行下去的方法
(当然是对的,只是不是从产生原因入手)
其实要解决这个问题很简单,只需要进行session.clean()操作就可以解决
了,但是你在clean操作后面又进行了saveOrUpdate(object)操作,有可能
会报出"Found two representations of same collection",我找了很多资料,
没有什么很好的解释,其中这篇文章帮助最大
http://opensource.atlassian.com/projects/hibernate/browse/HHH-509。
最后通过session.refresh(object)方法就可以解决了,注意,当object不
是数据库中已有数据的对象的时候,不能使用session.refresh(object)因
为refresh是从hibernate的session中去重新取object,如果session中没
有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判
断一下
当然这个问题最容易解决的办法还是使用Hibernate里面自带的merge()
方法。不过我始终觉得碰到问题就用这种软件自带的非常用方法
(和saveOrUpdate(),save(),update()相比)感觉十分不爽。
后来我还发现这种错误经常出现在一对多映射和多对多映射,请大家在
使用一对多和多对多映射的时候要小心一些
Hibernate 疑难异常及处理
1、a different object with the same identifier value was already associated with the session。
错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。
解决方法一:session.clean()
PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。
解决方法二:session.refresh(object)
PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的 session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。
解决方法三:session.merge(object)
PS:Hibernate里面自带的方法,推荐使用。
2、Found two representations of same collection
错误原因:见1。
解决方法:session.merge(object)
以上两中异常经常出现在一对多映射和多对多映射中
|
分享到:
相关推荐
- **新对象**:如果传入的对象的标识符在当前Session中不存在,则`merge`会将其视为一个新的对象,并执行插入操作。 #### 2. `update` 方法 `update` 方法主要用于更新已存在的持久化对象的状态。当调用`update`...
即使对象是新的,它也会先尝试在数据库中找到匹配的对象,如果找不到,则创建一个新的记录。在一对一或一对多等关联关系中,`merge()` 会处理关联的对象,确保它们都被正确地保存或更新。 5. **update()**: `...
4. **并发控制**:当多个线程同时对同一个对象进行`saveOrUpdate`操作时,可能会出现并发问题。Hibernate提供了乐观锁和悲观锁策略来处理这种并发冲突,需要在实体类中添加版本字段或其他机制。 5. **节省代码**:...
`saveOrUpdate`是Hibernate提供的一个便捷方法,它的主要作用是根据对象当前的状态来决定执行`save()`还是`update()`操作。具体来说: - 如果对象是瞬时状态,`saveOrUpdate`会调用`save()`,为对象生成一个新的...
如果不存在,则执行插入操作。这样可以避免手动判断对象是否存在,简化了代码。 #### 四、示例代码分析 为了更好地理解这两种方法的使用场景,我们来看一段示例代码: ```java // 在第一个Session中 Cat cat = ...
1. 创建实体类:实体类代表数据库中的表,每个实体类对应一张表,使用@Entity注解标识。 2. 属性映射:使用@Id注解标记主键,@Column注解映射字段,还可以使用@ManyToOne、@OneToMany等注解处理关联关系。 三、...
但是,`persist`有一个重要的特性,即它不保证会立即执行SQL INSERT语句。在某些情况下,如事务外部调用`persist`时,它可能不会立即执行INSERT操作,而是等到Session flush时才会执行。 - **save** 方法则是直接...
如果对象已经有一个有效的标识符(ID),那么Hibernate会尝试更新数据,否则,它会生成一个新的ID并执行INSERT操作。需要注意的是,`save()`方法并不立即执行SQL,而是等到事务提交时才执行。 5. `session.update()...
如果尝试更新一个不存在的记录,将会失败。 - **saveOrUpdate()**:自动判断对象状态,如果对象是新的,执行`save()`;如果是已存在的,执行`update()`。避免了在不确定对象状态时的冲突。 - **persist()**:将...
Java面试中,ORM(对象关系映射)是一个常见的知识点,它是一种技术,用来解决面向对象编程语言与关系数据库之间的不匹配问题。ORM通过元数据(例如XML或注解)将对象模型映射到数据库关系模型,使得程序可以直接...
根据表主键id删除一条数据,在PL/SQL上执行commit后执行时间都大于5秒。!!! 问题分析: 需求是删除一个主表A,另有两个附表建有此表的主键ID的外键。删除A表的数据级联删除另两个表的关联数据。增删改查使用...
- `final`关键字用于声明一个变量不可改变,或一个类不能被继承,或一个方法不能被重写。 - `finally`用于异常处理,确保在try-catch块中无论是否发生异常,finally块中的代码总会被执行。 - `finalize`是Object...
- `saveOrUpdate` 会直接抛出异常,而 `merge` 则会创建一个新的对象副本并返回。 #### 五、常见问题及解决方案 - **如何处理 NonUniqueObjectException 异常?** 当调用 `saveOrUpdate` 或 `merge` 时,如果 ...
这可能是因为在多线程环境中,一个线程正在使用Session时,另一个线程尝试访问或修改Session,导致并发控制问题。此外,不正确的`flush`或事务提交顺序也可能导致该异常。例如: 1. 在事务中,如果先调用了`evict`...
在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...
这是一个核心方法,它接受一个HibernateCallback接口的实例作为参数,允许在事务上下文中执行自定义的数据库操作。`execute`方法会确保在事务中执行回调方法,这样可以保证数据库操作的原子性。`exposeNativeSession...
Hibernate通过`Session`对象来管理对象的状态,当一个持久化对象(Persistent Object)的状态发生改变时,如果不做特殊处理,Hibernate会默认在事务提交时将这些变化同步到数据库。这种机制被称为“脏检查”(Dirty ...
对于创建(Create),我们通常需要一个表单来收集用户输入,提交后Action类将数据传递给Hibernate的Session,通过save()或saveOrUpdate()方法将数据保存到数据库。 读取(Read)操作通常涉及查询数据库中的信息。在...