`

Hibernate通过update来处理游离状态对象

阅读更多
摘自圣思园hibernate18. 领域对象的三种状态深入详解- 25分钟

上一篇文章中讲到hibernate中对象的三种状态。
http://alleni123.iteye.com/admin/blogs/1977132

这里要说的就是通过update语句对游离状态进行持久化。在开发中是比较常用的一个方法。


先看一下hibernate文档对update方法的说明:

void update(Object object)

  Update the persistent instance with the identifier of the given detached instance. If there is a persistent instance with the same identifier, an exception is thrown. This operation cascades to associated instances if the association is mapped with cascade="save-update".

要理解的是中间那句"If there is a persistent instance with the same identifier, an exception is thrown"
这个意思其实是说, 如果我们执行
User u=new User(1,"allen");
User u2=(User)session.get(User.class,1);
session.update(u);

此时会抛出异常:
Exception in thread "main" org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.lj.zhang.User#1]
at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:697)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:296)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:241)
at org.hibernate.event.internal.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireUpdate(SessionImpl.java:786)
at org.hibernate.internal.SessionImpl.update(SessionImpl.java:778)
at org.hibernate.internal.SessionImpl.update(SessionImpl.java:774)


这里看一下StatefulPersistenceContext的源码:
/**
* Attemps to check whether the given key represents an entity already loaded  with the current session.
* @param object The entity reference against which to perform the uniqueness  check
**/

public void checkUniqueness(EntityKey key, Object object) { //这里的参数是1和我们自定义的User对象。
   Object entity=getEntity(key), //Object entity=getEntity(key)执行之后entity被赋予了get获取的那个User对象,该对象被从session缓存中提取出来。
   if(entity==object)
   { throw new AssertionFailure ("object already associated, but no entry was found");}
    if(entity!=null){//由于entity!=null成立, 于是抛出NonUniqueObjectException。
   throw new NonUniqueObjectException(key.getIdentifier(), key.getEntityName());
    }

}



也就是说, 当我们要对持久化对象进行update(既更新数据库对象时),我们不应该通过get或者load从数据库读取该id的对象到session缓存中。

-Session的update()方法完成以下操作:
1. 把User对象重新加入到Session缓存中,使它变为持久化对象。
2. 计划执行一个update语句。 值得注意的是,Session只有在清理缓存的时候才会执行update语句,并且在执行时才会把User对象当前的属性值组装到update语句中。 因此,即使程序中多次修改了User对象的属性,在清理缓存时只会执行一次update语句。
分享到:
评论

相关推荐

    Hibernate 对象的三种状态和特点

    这些状态决定了对象与数据库之间的关联程度,以及Hibernate如何处理对象的生命周期。以下是Hibernate对象的三种主要状态及其特点: 1) 临时状态(Transient State): 当通过`new`关键字创建一个新的对象时,该对象...

    hibernate对象三种状态

    在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...

    Hibernate中的实体状态及转换

    游离状态的对象可以通过Session的`update()`, `saveOrUpdate()`方法重新纳入Session的管理,恢复为持久化状态。 接下来,我们详细讨论这些状态之间的转换: **临时状态(Transient) -> 游离状态(Detached)**:要将...

    Hibernate对象持久化状态

    本篇文章将详细阐述 Hibernate 中对象的三种状态——临时状态、持久化状态和游离状态,以及 Session 缓存的工作原理。 1. Session 缓存及作用 Session 是 Hibernate 提供的一个接口,它充当了应用程序与数据库之间...

    Hibernate持久化对象的生命周期

    首先,我们来看一下Hibernate中持久化对象的三种基本状态: 1. **瞬时对象(Transient Objects)**: - 当使用`new`关键字创建一个新的Java对象时,该对象是瞬时的。这意味着它们与数据库没有任何关联。如果对象...

    Hibernate Session 4种对象状态.docx

    Hibernate将对象的状态划分为四种:临时状态、持久化状态、游离状态和删除状态。这些状态反映了对象与数据库记录之间的关系,有助于理解Hibernate如何管理和操作数据。 1. **临时状态(Transient State)**: 当一...

    hibernate的各种保存方式的区别以及hibernate对象的三种状态[定义].pdf

    - update()用于更新已存在于数据库中的对象,对象必须是持久化或游离状态。 4. update()和saveOrUpdate()的区别: - update()仅用于更新数据库中的对象,对象必须有持久化标识。 - saveOrUpdate()则更智能,它会...

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

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

    Hibernate 对象的状态检索

    本人在厦门邦初培训时候 使用的快速入门精简文档 ...对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。 延迟装载 迫切左外链接 HQL检索方式 QBC检索方式 本地SQL检索方式

    Hibernate 三种状态

    在 Hibernate 中,对象的状态管理是其核心特性之一,主要包括三种状态:瞬时状态(Transient)、持久化状态(Persistent)以及游离状态(Detached)。本文将详细阐述这三种状态的特点及其转换机制。 #### 二、瞬时...

    hibernate持久化对象生命周期[参照].pdf

    它允许开发者使用面向对象的编程方式来处理数据库操作,极大地简化了数据访问层的复杂性。本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象...

    Hibernate中的merge使用详情解说.docx

    综上所述,`merge()`方法是Hibernate中处理对象状态转换和数据同步的重要工具。它能够处理各种对象状态,确保数据的一致性和完整性,同时避免了可能的冲突。在设计和实现业务逻辑时,理解并正确使用`merge()`对于...

    hibernate三态详解.doc

    - `update()`:用于更新已存在的持久化对象,如果对象是游离状态,Hibernate 将先将其变为持久化状态再执行更新。 - `saveOrUpdate()`:根据对象的状态决定是插入还是更新,如果对象是新的(无 ID),则执行插入;...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     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()...

    hibernate三状态

    - **游离态 -> 持久态**:通过Session的merge()、update()或saveOrUpdate()方法,可以将游离态对象重新与Session关联,成为持久态。 - **游离态 -> 瞬时态**:如果游离态对象的ID不再被引用,那么对象就可能变为瞬...

    hibernate的各种保存方式的区别

    可以通过`Session`的`evict()`方法将持久状态的对象变为游离状态,或者当`Session`关闭时,所有持久状态的对象也会变成游离状态。 #### 二、Hibernate中常见的保存方式及其区别 1. **`save()`**: - 功能:用于将...

    Hibernate实体对象操纵

    在Java开发中,Hibernate是一款非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库数据。本篇文章将深入探讨Hibernate中的实体对象操纵,包括实体的概念...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联...

    Hibernate选择题(含答案).doc

    Hibernate 是一个流行的...总的来说,Hibernate通过提供面向对象的接口和自动化处理事务、对象状态转换等功能,极大地简化了Java应用的数据持久化工作。理解其配置、对象状态管理以及事务处理是使用Hibernate的关键。

    Hibernate的Session的javadoc

    如果对象是游离状态,就调用update()。这是最常用的持久化方法。 - **update()**:更新数据库中与对象关联的记录,对象必须处于持久化状态。 - **merge()**:将游离或自由状态的对象合并到当前Session,创建一个新...

Global site tag (gtag.js) - Google Analytics