以前以为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);
- }
- }
分享到:
相关推荐
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...