`
weishuwei
  • 浏览: 322181 次
  • 性别: 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. }  
分享到:
评论

相关推荐

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    应用程序通过读取配置文件来获取到指定名称的类的字节码文件并加载其中的内容进行调用,对一个类文件进行解剖,就可以取得任意一个已知名称的class的内部信息,包括其modifiers(诸如public,static等等)、...

    java源码包2

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包---java 源码 大量 实例

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包3

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包4

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics