今天写项目在一个方法中update一个对象的时候报出如下错误:
org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
去网上查了下,把update方法换成了merge方法后问题解决。
于是在此把对对象的相关操作和概念总结一下。
首先,在hibernate中对象有四种状态:
瞬时状态:一个新建的对象是处于瞬时状态的,即不和数据库中的任意表有关联。
持久化状态:这个对象是包含数据库同一性的实体。
移除状态:一个对象如果已经被计划在一个工作单元结束时删除,它就是处于移除状态。
脱管状态:对象状态不与数据库状态同步,但仍包含持久化数据。
然后在介绍Session中几个常用方法之前,还要再提一下脏对象的相关概念。hibernate有个策略,用来侦测哪个持久化对象已经被应用程序修改,被称为自动脏检查。一个被修改过的对象还没有传播到数据库之前都被认为是脏的。
1.save方法
将瞬时实例持久化,此时它与当前的session和持久化上下文都建立了联系。
2.get/load方法
这两个方法都是从数据库中取得持久化对象,在持久化上下文关闭后变为脱管状态。其区别在于如果数据库中不存在指定标识符的行,get会返回null,而load会抛出ObjectNotFoundException。
3.delete方法
调用后对象变为移除状态,session关闭后变为瞬时状态。
4.replicate方法
用于从一个数据库中获取对象并负责到另一个数据库。
5.update/lock方法
对象在传递到update方法之前是否被修改没有关系,update方法把这个脱管实例附到一个新的session及持久化上下文,hibernate始终将这个对象当做脏对象来处理。而在调用lock之前对对象的修改不会传播到数据库。
6.merge方法
调用merge方法的时候,hibernate会检查在持久化上下文中的持久化实例是否和脱管实例具有相同的标识符。如果有,把脱管实例的状态负责到持久化实例中;如果没有,就从数据库中加载,然后把脱管实例和获取的对象状态合并;如果数据库中没有查到结果,就创建新的持久化实例,把脱管实例的状态复制到新实例,插入到数据库中,并通过merge()操作返回。
分享到:
相关推荐
Hibernate 是一个流行的 Java 开发框架,用于简化数据库...理解 Hibernate 对象状态及其转换对于有效管理和优化数据库操作至关重要。正确使用这些状态和保存方法能够避免数据冗余和丢失,提高应用的性能和数据一致性。
在Java的持久化框架Hibernate中...正确管理对象状态可以帮助优化数据库交互,减少不必要的查询,提高系统的整体性能。在实际开发中,开发者需要根据业务需求和性能考虑,灵活运用这些状态,确保数据的一致性和完整性。
在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...
总结,Hibernate操纵持久化对象涉及多个方面,包括对象状态管理、事务处理、查询机制、缓存策略以及关系映射等。熟练掌握这些概念和操作,将极大地提高开发效率,并有助于构建高效、稳定的数据库应用程序。通过实践...
总结来说,理解和掌握实体对象的三种状态以及`saveOrUpdate`方法是优化Hibernate应用的基础。通过深入学习这些概念,开发者能够更有效地处理数据持久化,提高代码的稳定性和可维护性。在实践中,应根据具体需求选择...
Hibernate对象有三种状态:瞬时状态(Transient)、持久状态(Persistent)和脱管状态(Detached)。理解这些状态对于优化数据操作和避免潜在的问题至关重要。 首先,瞬时状态(Transient)是指通过new关键字创建的...
一、Hibernate对象的三种状态 1. **瞬时态(Transient)**:这是对象的初始状态,当我们在内存中创建一个新的实体对象时,它就处于瞬时态。这种状态下,对象与数据库没有任何关联,即使对象的属性值发生了变化,也...
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...
SSHnote session函数的对象状态转换是Hibernate框架中一个关键的概念,涉及到如何管理数据库中的持久化对象。在Hibernate中,对象有三种基本状态:瞬时(Transient)、持久化(Persistent)和脱管(Detached)。理解...
当对象属性发生变化时,Hibernate会自动跟踪并更新数据库。 - **游离态(Detached)**:对象曾是持久态,但当前Session已经关闭,对象与数据库的连接断开。可以通过Session的merge()方法重新建立联系。 - **删除态...
本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象(Transient Objects) 瞬时对象是指通过`new`操作符创建但尚未与数据库记录关联的Java对象...
2. Hibernate对象的三种状态: -瞬时态(Transient):对象刚刚被创建,尚未与Session关联,也没有持久化到数据库中。如果对象在这个状态下被垃圾收集器回收,那么对象的信息将会丢失。 -持久态(Persistent):...
当对象的状态变化时,Hibernate会自动将这些变化同步到数据库,反之亦然。此外,它还提供了查询语言HQL(Hibernate Query Language)和Criteria API,用于执行复杂的数据库查询。 3. **主要组件**: - **...
### 二、对象状态及数据类型基数 Hibernate 中的对象有四种状态:瞬时态、持久态、脱管态和临时态。了解这些状态对于正确管理对象至关重要。 1. **瞬时态**:对象未与 Session 关联,不持久化。 2. **持久态**:...
在Hibernate中,有三种主要的对象状态:瞬时状态(Transient)、持久状态(Persistent)、和游离状态(Detached)。瞬时状态的对象是刚被实例化,尚未与数据库中的数据进行关联。持久状态的对象与Session关联并被...
Hibernate允许我们将对象状态转换为XML格式,这在多种场景下非常有用,例如在需要将数据导出到外部系统进行处理时,或者在需要支持数据的多种格式时。 在Hibernate中使用XML数据存储,通常涉及到以下几个关键概念和...
Hibernate通过Interceptor和Event Listeners等机制监控对象状态的变化,自动处理对象的持久化操作,如Save、Update、Delete等。 四、查询语言HQL与Criteria API Hibernate提供两种高级查询语言:HQL(Hibernate ...
4. **对象状态**:Hibernate将对象分为瞬时(Transient)、持久化(Persistent)、游离(Detached)三种状态。理解这些状态对于有效使用Hibernate至关重要,例如,当对象由Session管理时,其状态变化会影响到数据库...