关于hibernate中出现a different object with the same identifier value was already associated with the session的错误。
出现原因和解决方式:
出现该问题的原因:
说到这里,我想我也应该重新认识下hibernate了,在hibernate中,对象状态分为三种:瞬时态(transient)、持久态(persistent)和游离态(detached)。其中瞬时态:就是用户自己定义的,通俗点说就是自己new出来的对象,还没有与session相关联,此时的对象为瞬时态;持久态:已经被持久化,与session相关联,加载到了session缓存中,session要负责把持久化的对象更新到数据库,此时的对象称为持久化对象;游离态:已经被持久化,但是不在session的缓存中了。
这三种状态的转换过程为:
注:此图引用自http://blog.csdn.net/yyywyr/article/details/6645040。
在我的项目中,情况为在一个dao方法中,先使用find方法进行查询,这时查询出来的对象是处于持久化状态的,而执行deleteAll方法后,并没有立即同步到数据库,而是告诉session需要执行delete方法,session会计划执行delete语句,即这时对象的状态还是持久态,所以后面执行saveOrUpdate方法时会出现a different object with the same identifier value was already associated with the session的错误。
解决方式:
1. 将saveOrUpdate方法改为merge,说到这里我想应该再说下merge方法和saveOrUpdate方法的区别了,其中saveOrUpdate方法,即为save和update方法的结合,如果要执行该方法的对象已经持久化了,则该方法不进行任何操作,但是如果要执行该方法的对象与该session相关联的对象存在相同的标示符,则会抛出a different object with the same identifier value was already associated with the session的错误,因为。而merge方法处理这样的事情时,则会将新的对象赋值给持久态的对象,而自己本身不变为持久态,故可以将saveOrUpdate方法换为merge方法。
2. 使用for循环迭代删除后,然后再迭代保存。for(;;)delete(obj);} for(;;){save},在逐个执行delete方法时,删除的对象会从持久态变为游离态(但是最后一个可能会例外,这里我没有进行测试,有兴趣的朋友可自己测试下);
故综上所述,我认为使用merge方法比较好。
相关推荐
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它极大地简化了数据库操作。然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为...
hibernate中session对象的状态详解
在Java的持久化框架中,Hibernate是一个非常重要的组件,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的核心概念——Session管理。 首先,...
本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query Language)查询以及在线查询和离线查询的概念。 首先,我们来详细讨论`Session`对象。在Hibernate中,`Session`是应用程序与数据库之间的...
在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...
Hibernate有两级缓存:一级缓存(Session级缓存)和二级缓存(SessionFactory级缓存)。一级缓存默认开启,它是自动的,当对象在Session中被修改并提交后,这些变化会被立即写入数据库。二级缓存则需要手动配置和...
Session对象就像一个临时的工作区域,用于在应用程序和数据库之间传递信息。当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 ...
Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对数据库的操作,而无需编写大量的...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它使得开发者可以使用面向对象的方式来操作数据库。"重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
在IT行业中,数据库操作是应用程序开发中的重要环节,而Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了Java应用程序对数据库的操作。本篇文章将深入探讨如何实现自己的Hibernate框架,特别是Session...
Session 是 Hibernate 中一个核心概念,负责管理应用程序与数据库之间的交互。获取 Session 是使用 Hibernate 的第一步骤。下面将详细介绍 Hibernate 中获取 Session 的两种方式代码示例。 什么是 Session? ...
本文将深入探讨这两个主题,以帮助开发者更好地理解和利用Hibernate。 首先,让我们聚焦于Hibernate的缓存机制。缓存的存在是为了减少对数据库的直接访问,从而提高应用程序的性能。在Hibernate中,缓存分为一级...
在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...
在Java的持久化框架中,Hibernate是一个非常重要的存在,它为开发者提供了强大的对象关系映射(ORM)功能,简化了数据库操作。本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个...
在 Hibernate 中,每个线程都需要一个 Session 对象来与数据库交互。如果未绑定 Session 到线程, Hibernate 将无法正确地执行数据库操作。 解决方案 解决该错误的方法很简单,只需在相应的 manager 实现类中添加 ...
当一个对象刚刚被创建,并未通过Hibernate的Session接口进行任何操作时,它处于临时状态。此时,对象未与数据库中的任何记录关联,没有被分配唯一的数据库ID,如果对象发生改变,不会影响数据库中的数据。 2. **...
《妙解Hibernate 3.x:叩响面向对象思想之门》是一本深入解析Hibernate框架的专著,旨在帮助读者理解并掌握面向对象编程思想在实际开发中的应用,尤其是在使用Hibernate时如何有效地进行数据持久化。这本书是面向...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它使得开发者可以更加方便地处理数据库操作。本篇文章将探讨如何对Hibernate的`Session`进行简单的包装,以提升代码的可维护性和灵活性。...
`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...