`
ourteam
  • 浏览: 132657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个SaveOrUpdate的不执行问题

 
阅读更多

转自: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)

以上两中异常经常出现在一对多映射和多对多映射中

分享到:
评论
1 楼 379855529 2014-06-28  
谢谢您老师,解决了我好久没有解决的问题。

相关推荐

    Hibernate merge、update与saveOrUpdate方法的区别

    - **新对象**:如果传入的对象的标识符在当前Session中不存在,则`merge`会将其视为一个新的对象,并执行插入操作。 #### 2. `update` 方法 `update` 方法主要用于更新已存在的持久化对象的状态。当调用`update`...

    save, saveOrUpdate, persist, merge, update 区别.docx

    即使对象是新的,它也会先尝试在数据库中找到匹配的对象,如果找不到,则创建一个新的记录。在一对一或一对多等关联关系中,`merge()` 会处理关联的对象,确保它们都被正确地保存或更新。 5. **update()**: `...

    hibernate 的saveOrUpdate

    4. **并发控制**:当多个线程同时对同一个对象进行`saveOrUpdate`操作时,可能会出现并发问题。Hibernate提供了乐观锁和悲观锁策略来处理这种并发冲突,需要在实体类中添加版本字段或其他机制。 5. **节省代码**:...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    `saveOrUpdate`是Hibernate提供的一个便捷方法,它的主要作用是根据对象当前的状态来决定执行`save()`还是`update()`操作。具体来说: - 如果对象是瞬时状态,`saveOrUpdate`会调用`save()`,为对象生成一个新的...

    Hibernate save() saveorupdate()的用法第1/2页

    如果不存在,则执行插入操作。这样可以避免手动判断对象是否存在,简化了代码。 #### 四、示例代码分析 为了更好地理解这两种方法的使用场景,我们来看一段示例代码: ```java // 在第一个Session中 Cat cat = ...

    Hibernate执行持久层访问步骤

    1. 创建实体类:实体类代表数据库中的表,每个实体类对应一张表,使用@Entity注解标识。 2. 属性映射:使用@Id注解标记主键,@Column注解映射字段,还可以使用@ManyToOne、@OneToMany等注解处理关联关系。 三、...

    hibernate的各种保存方式的区别

    但是,`persist`有一个重要的特性,即它不保证会立即执行SQL INSERT语句。在某些情况下,如事务外部调用`persist`时,它可能不会立即执行INSERT操作,而是等到Session flush时才会执行。 - **save** 方法则是直接...

    Hibernate持久层方法汇总

    如果对象已经有一个有效的标识符(ID),那么Hibernate会尝试更新数据,否则,它会生成一个新的ID并执行INSERT操作。需要注意的是,`save()`方法并不立即执行SQL,而是等到事务提交时才执行。 5. `session.update()...

    Hibernate 映射关系! 基础封装

    如果尝试更新一个不存在的记录,将会失败。 - **saveOrUpdate()**:自动判断对象状态,如果对象是新的,执行`save()`;如果是已存在的,执行`update()`。避免了在不确定对象状态时的冲突。 - **persist()**:将...

    JAVA面试问题及标准答案.docx

    Java面试中,ORM(对象关系映射)是一个常见的知识点,它是一种技术,用来解决面向对象编程语言与关系数据库之间的不匹配问题。ORM通过元数据(例如XML或注解)将对象模型映射到数据库关系模型,使得程序可以直接...

    oracle 数据按主键删除慢问题的解决方法

    根据表主键id删除一条数据,在PL/SQL上执行commit后执行时间都大于5秒。!!! 问题分析: 需求是删除一个主表A,另有两个附表建有此表的主键ID的外键。删除A表的数据级联删除另两个表的关联数据。增删改查使用...

    Java开发工程师招聘面试题

    - `final`关键字用于声明一个变量不可改变,或一个类不能被继承,或一个方法不能被重写。 - `finally`用于异常处理,确保在try-catch块中无论是否发生异常,finally块中的代码总会被执行。 - `finalize`是Object...

    hibernate各种常用方法的详解

    - `saveOrUpdate` 会直接抛出异常,而 `merge` 则会创建一个新的对象副本并返回。 #### 五、常见问题及解决方案 - **如何处理 NonUniqueObjectException 异常?** 当调用 `saveOrUpdate` 或 `merge` 时,如果 ...

    Hibernate的事务处理机制和flush方法的用法.docx

    这可能是因为在多线程环境中,一个线程正在使用Session时,另一个线程尝试访问或修改Session,导致并发控制问题。此外,不正确的`flush`或事务提交顺序也可能导致该异常。例如: 1. 在事务中,如果先调用了`evict`...

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    Hibernate方法总结

    这是一个核心方法,它接受一个HibernateCallback接口的实例作为参数,允许在事务上下文中执行自定义的数据库操作。`execute`方法会确保在事务中执行回调方法,这样可以保证数据库操作的原子性。`exposeNativeSession...

    如何解决hibernate自动更新实体类的问题共5页.pd

    Hibernate通过`Session`对象来管理对象的状态,当一个持久化对象(Persistent Object)的状态发生改变时,如果不做特殊处理,Hibernate会默认在事务提交时将这些变化同步到数据库。这种机制被称为“脏检查”(Dirty ...

    struts CRUD+HIbernate 多对一查询+部分表删除功能

    对于创建(Create),我们通常需要一个表单来收集用户输入,提交后Action类将数据传递给Hibernate的Session,通过save()或saveOrUpdate()方法将数据保存到数据库。 读取(Read)操作通常涉及查询数据库中的信息。在...

Global site tag (gtag.js) - Google Analytics