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. }  
發佈了2 篇原創文章 · 獲贊 1 · 訪問量 4139
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章