`
weishuwei
  • 浏览: 324738 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate中对象状态的判定是根据状态码进行的

阅读更多
以前以为hibernate是通过id来却分对象的状态的,分析源码才发现是通过状态标识的,hibernate会自动为你的对象添加一个状态标识,具体如下:
  1. protected static final int PERSISTENT = 0;   
  2. protected static final int TRANSIENT = 1;   
  3. protected static final int DETACHED = 2;   
  4. protected static final int DELETED = 3;   
  5.   
  6. switch ( entityState ) {   
  7.     case DETACHED:   
  8.     entityIsDetached( event );   
  9.     return null;   
  10.     case PERSISTENT:   
  11.     return entityIsPersistent( event );   
  12.     default//TRANSIENT or DELETED   
  13.     return entityIsTransient( event );   
  14. }   
  15.   
不管是save,update还是saveOrUpdate,hibernate都会调用DefaultSaveOrUpdateEventListener类的onSaveOrUpdate(......)方法,代码如下:
  1. SaveOrUpdateEventListener是个接口,实现类为DefaultSaveOrUpdateEventListener   
  2. public void onSaveOrUpdate(SaveOrUpdateEvent event) {   
  3.     final SessionImplementor source = event.getSession();   
  4.     final Object object = event.getObject();//在这里object已经携带有信息了,只不过id还是为0   
  5.     final Serializable requestedId = event.getRequestedId();//这里都为null.这个只有调用save(Obj,id)才有值.   
  6.   
  7.     if ( requestedId != null ) {   
  8.         //assign the requested id to the proxy, *before*    
  9.         //reassociating the proxy   
  10.         if ( object instanceof HibernateProxy ) {   
  11.             ( ( HibernateProxy ) object ).getHibernateLazyInitializer().setIdentifier( requestedId );   
  12.         }   
  13.     }   
  14.   
  15.     if ( reassociateIfUninitializedProxy( object, source ) ) {//执行2次,这里都为false   
  16.         log.trace( "reassociated uninitialized proxy" );   
  17.         // an uninitialized proxy, noop, don't even need to    
  18.         // return an id, since it is never a save()   
  19.     }   
  20.     else {   
  21.         //initialize properties of the event:初始化属性,把   
  22.         final Object entity = source.getPersistenceContext().unproxyAndReassociate( object );   
  23.         event.setEntity( entity );   
  24.         event.setEntry( source.getPersistenceContext().getEntry( entity ) );//从session中拿出obj相关的entityentry,这个对象持有po当前的状态   
  25.         //return the id in the event object   
  26.         event.setResultId( performSaveOrUpdate( event ) );//执行完这句后,还会再次执行onSaveOrUpdate()方法,这时,event.getObject返回的Object     的id已经有值了   
  27.     }   
  28.   
  29. }   
以下代码中hibernate会从session中读取对象的快照,如果没有,对象的状态就是TRANSIENT
  1. DefaultSaveEventListener类,继承自DefaultSaveOrUpdateEventListener   
  2. protected Serializable performSaveOrUpdate(SaveOrUpdateEvent event) {   
  3.     // this implementation is supposed to tolerate incorrect unsaved-value   
  4.     // mappings, for the purpose of backward-compatibility   
  5.     EntityEntry entry = event.getSession().getPersistenceContext().getEntry( event.getEntity() );   
  6.     //第一次执行到这里entry为null,第二次这里还是null   
  7.     if ( entry!=null && entry.getStatus() != Status.DELETED ) {   
  8.     //如果在obj在session已经有对应的entityentry,即obj已经是po,且状态是DELETED,那么执行delete操作   
  9.         return entityIsPersistent(event);   
  10.     }   
  11.     else {   
  12.         return entityIsTransient(event);   
  13.     }   
  14. }  
分享到:
评论

相关推荐

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    Hibernate 对象的三种状态和特点

    在Java的持久化框架Hibernate中,对象的状态是理解其工作原理的关键部分。这些状态决定了对象与数据库之间的关联程度,以及Hibernate如何处理对象的生命周期。以下是Hibernate对象的三种主要状态及其特点: 1) 临时...

    Hibernate中对象的三种状态

    在Java的持久化框架Hibernate中,对象的状态管理是其核心特性之一。理解并掌握对象的三种状态对于开发高效、稳定的数据库应用至关重要。本篇将详细阐述Hibernate中的瞬时态、持久态和脱管态,以及它们之间的转换。 ...

    Hibernate对象状态以及各种保存方法的区别

    在 Hibernate 中,对象的状态管理是至关重要的,因为它直接影响到对象如何与数据库交互。以下是 Hibernate 中对象的三种状态以及相关的保存方法: 1. **瞬时对象(Transient Objects)** - 当使用 `new` 关键字...

    hibernate对象三种状态

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

    Hibernate中的实体状态及转换

    本文将深入探讨Hibernate中的实体状态及其转换,帮助开发者更好地掌握如何有效地使用Hibernate进行数据操作。 首先,我们要了解Hibernate定义的三种实体状态: 1. **临时状态(Transient)**:当我们在程序中通过`...

    Hibernate三种状态区分

    在 Hibernate 中,对象有三种不同的状态,这些状态决定了对象与数据库之间的关联程度以及如何进行数据操作。理解这些状态对于有效地使用 Hibernate 至关重要。 1. **瞬时态(Transient)**: - 瞬时态的对象是刚刚...

    Hibernate持久化对象的生命周期

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

    Hibernate 操纵持久化对象

    在Hibernate中,持久化对象是指具有与数据库表相对应状态的Java对象。一旦一个对象被持久化,它就处于Hibernate的管理之下,其生命周期将与数据库记录绑定。Hibernate提供了四种对象状态:瞬时态、持久态、脱管态和...

    Hibernate对象持久化状态

    在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库交互效率。本篇文章将详细阐述 Hibernate 中对象的三种状态——临时状态、持久化状态和游离状态,以及...

    Hibernate操作持久化对象

    在Hibernate中,对象的状态分为瞬时状态、持久状态和脱管状态。瞬时状态的对象存在于内存中,但未与SessionFactory关联;持久状态的对象已经被持久化到数据库,并且可以通过SessionFactory追踪;脱管状态的对象曾经...

    Hibernate 对象的状态检索

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

    Hibernate对象的生命周期

    Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...

    Hibernate Session 4种对象状态.docx

    在Java的持久化框架Hibernate中,对象的状态管理是其核心功能之一。Hibernate将对象的状态划分为四种:临时状态、持久化状态、游离状态和删除状态。这些状态反映了对象与数据库记录之间的关系,有助于理解Hibernate...

    精通Hibernate:Java对象持久化详解.zip

    在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质(如数据库)的过程。Hibernate通过提供一种对象-关系映射机制,使得Java对象可以直接与数据库表进行交互,而无需编写大量的SQL语句。这种映射机制...

    精通Hibernate:Java对象持久化技术详解

    《精通Hibernate:Java对象持久化技术详解》一书聚焦于Java开发中的对象持久化技术,主要围绕Hibernate这一流行ORM框架进行深入探讨。Hibernate是Java世界里的重要工具,它简化了数据库操作,使得开发者可以更加专注...

    Hibernate中po对象的三种状态分析[借鉴].pdf

    以下是关于Hibernate中对象的三种状态以及保存方法的详细分析: 1. **对象的三种状态** - **瞬态(Transient)**:对象刚被创建,尚未与任何Session关联,不具备持久化能力。对瞬态对象的修改不会自动同步到数据库...

    hibernate中文参考手册

    在Hibernate中,核心概念包括实体(Entities)、持久化类(Persistent Classes)、会话(Sessions)、事务(Transactions)和查询(Queries)。实体是应用程序中的业务对象,它们对应数据库中的表;持久化类是包含@...

    Java 精通Hibernate对象持久化技术权威指南

    《Java精通Hibernate对象持久化技术权威指南》是一本深度探讨Java开发中如何高效地使用Hibernate进行对象持久化的专业书籍。本书旨在帮助Java开发者熟练掌握Hibernate框架,实现数据库操作的简化和自动化,提升软件...

Global site tag (gtag.js) - Google Analytics