以前以爲hibernate是通過id來卻分對象的狀態的,分析源碼才發現是通過狀態標識的,hibernate會自動爲你的對象添加一個狀態標識,具體如下:
- protected static final int PERSISTENT = 0;
- protected static final int TRANSIENT = 1;
- protected static final int DETACHED = 2;
- protected static final int DELETED = 3;
-
- switch ( entityState ) {
- case DETACHED:
- entityIsDetached( event );
- return null;
- case PERSISTENT:
- return entityIsPersistent( event );
- default:
- return entityIsTransient( event );
- }
-
不管是save,update還是saveOrUpdate,hibernate都會調用
DefaultSaveOrUpdateEventListener類的onSaveOrUpdate(......)方法,代碼如下:
- SaveOrUpdateEventListener是個接口,實現類爲DefaultSaveOrUpdateEventListener
- public void onSaveOrUpdate(SaveOrUpdateEvent event) {
- final SessionImplementor source = event.getSession();
- final Object object = event.getObject();
- final Serializable requestedId = event.getRequestedId();
-
- if ( requestedId != null ) {
-
-
- if ( object instanceof HibernateProxy ) {
- ( ( HibernateProxy ) object ).getHibernateLazyInitializer().setIdentifier( requestedId );
- }
- }
-
- if ( reassociateIfUninitializedProxy( object, source ) ) {
- log.trace( "reassociated uninitialized proxy" );
-
-
- }
- else {
-
- final Object entity = source.getPersistenceContext().unproxyAndReassociate( object );
- event.setEntity( entity );
- event.setEntry( source.getPersistenceContext().getEntry( entity ) );
-
- event.setResultId( performSaveOrUpdate( event ) );
- }
-
- }
以下代碼中hibernate會從session中讀取對象的快照,如果沒有,對象的狀態就是TRANSIENT
- DefaultSaveEventListener類,繼承自DefaultSaveOrUpdateEventListener
- protected Serializable performSaveOrUpdate(SaveOrUpdateEvent event) {
-
-
- EntityEntry entry = event.getSession().getPersistenceContext().getEntry( event.getEntity() );
-
- if ( entry!=null && entry.getStatus() != Status.DELETED ) {
-
- return entityIsPersistent(event);
- }
- else {
- return entityIsTransient(event);
- }
- }