当前位置:首页 > 开发 > 编程语言 > Hibernate > 正文

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

发表于: 2013-11-20   作者:alleni123   来源:转载   浏览次数:
摘要: 摘自圣思园hibernate18. 领域对象的三种状态深入详解- 25分钟 上一篇文章中讲到hibernate中对象的三种状态。 http://alleni123.iteye.com/admin/blogs/1977132 这里要说的就是通过update语句对游离状态进行持久化。在开发中是比较常用的一个方法。 先看一下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通过update来处理游离状态对象

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1、瞬时对象(Transient Objects): 使用new操作符初始化的对象不是立刻持久的。的状态是瞬时的,
Hibernate对象有三种状态: 瞬时状态(Transient):对象新创建的时候,失去引用时被JVM回收; 可通
说明: Hibernate是一个ORM框架。也就是底层数据表和项目中实体对应关系的一个操作框架。当使用Hibe
Hibernate对象有三种状态: 瞬时状态(Transient):对象新创建的时候,失去引用时被JVM回收; 可通
Hibernate对象状态 在hibernate中有三种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Det
Hibernate持久化对象有三种状态:瞬时(transient)、持久(persistent)、托管(detached): 瞬时
Hibernate持久化对象有三种状态:瞬时(transient)、持久(persistent)、托管(detached): 瞬时
在hibernate中有三种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态
主键生成策略 主要为: 1、 native 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用
我们都知道hibernate中的数据对象有3种状态: 瞬时状态(Transient):由Java通过new方法创建的对象
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号