Hibernate 专题研究系列(一) save/update/saveOrUpdate等方法学习(续二)

 

4、persist
1) 返回值
   void
 
2)事件监听处理类及重要代码
    DefaultPersistEventListener
   protected   void   entityIsTransient(PersistEvent event, Map createCache) {
     LOG.trace(   "Saving transient instance"   );
 
      final   EventSource source = event.getSession();
      final   Object entity = source.getPersistenceContext().unproxy( event.getObject() );
 
      if   ( createCache.put( entity, entity ) ==   null   ) {
            saveWithGeneratedId( entity, event.getEntityName(), createCache, source,   false   );
     }
   }
 
3)事务范围外的处理方式
   非立即执行
 
4) 瞬时态
   如果在事务范围外,persist不会立即执行 insert sql,这是与save最大的区别;如果在事务范围内, persist会立即执行 insert sql,但事务没有提交,所以数据库中没数据。
   即使在事务范围外,即没有事务的情况下,save方法也会立即执行insert Sql; 如果 事务为 自动提交, 数据库中将有数据
 
5) 游离态
   如果对 游离态 的(DETACHED)实体进行persist,会抛出异常。
  org.hibernate.PersistentObjectException   : detached entity passed to persist: org.hibernate.tutorial.hbm.Event.
 
6) 持久态:实体对象本身不做任何动作。如果缓存中不存在持久态的实体,将会做一些级联操作。
 
5、merge
1) 返回值
   object
 
2)事件监听处理类及重要代码
  DefaultMergeEventListener
 
3)事务范围外的处理方式
   非立即执行
 
4) 瞬时态
4.1) 如果在事务范围外,merge不会立即执行 insert sql,这是与save最大的区别;如果在事务范围内, merge 会立即执行 insert sql,但事务没有提交,所以数据库中没数据。
     即使在事务范围外,即没有事务的情况下,save方法也会立即执行insert Sql; 如果 事务为 自动提交, 数据库中将有数据
          
4.2) 同时多次merge同一个瞬时态的实体并提交事务,数据库中会相应的有多条记录。因为,merge操作只会将瞬时态original对象做一个copy,然后对copy对象进行数据库持久化操作,
     所以original永远都是瞬时态;同理,多次merge同一个瞬时态对象,会执行多次insert操作。merge方法返回的对象才是被持久化的对象。
          
    Event copyObj = (Event) session.merge(event); //original对象的状态不变,仍然是瞬时态,返回的对象才是被持久化的对象。
 
5)游离态
   merge游离态对象时,会根据entity与id进行一次数据库查询,如果数据库中存在该实体对应的记录,会做一些收尾的辅助处理;如果不存在,则将该对象作为瞬时态进行处理。
    final  Object result = source.get(entityName, clonedIdentifier);
 
6)持久态
   不会进行数据库操作。
 
 
6、Replicate
1) 返回值
   void
 
   参数 (Object obj, ReplicationMode replicationMode)
 
2)事件监听处理类及重要代码
    DefaultReplicateEventListener
2.1)Replicate方法与save、update、saveOrUpdate、merge和persist最大的区别是不区分实体 状态,即不区分是否为瞬时态、游离态和持久态;但多一个复制模式的参数。
2.2)ReplicationMode 分为EXCEPTION、IGNORE、OVERWRITE、LATEST_VERSION。 EXCEPTION不管数据库是否存在关键字值相等的记录,都要插入。 IGNORE表示存在,则不复制。
      OVERWRITE,表示覆盖原来的。 LATEST_VERSION使用最新版本的。
2.3)如果根据关键字值,查找数据库中存在该条记录:
    I) canReplicate为true,即允许更新该条记录到数据库中,则创建一个entity对应的EntityEntry并加入到StatefulPersistenceContext中,即将该实体标示为持久态。
       等到flush(非显示事务且自动提交)时,或提交事务时,更新数据库。
    II)  canReplicate为false,即不允许更新该条记录至数据库,则放弃直接返回,不做任何处理。
2.4) 只有在数据库中没有查询到关键字值对应的记录,replicate操作才会执行Insert sql,其他情况不执行操作。
  I) 立即执行的情况,如果ID是由数据库而非代码生成( SequenceGenerator、 IdentityGenerator、 SelectGenerator策略 ), useIdentityColumn被赋值为true,则会立即执行。
  II) 不立即执行Insert Sql 如果ID是由 代码 而非 数据库 生成( SequenceGenerator、 IdentityGenerator、 SelectGenerator策略 ), useIdentityColumn被赋值为false,则不会立即执行。
 
3)事务范围外的处理方式
   见2.4。
 
4)瞬时态
   无。
 
5)持久态
   无。
 
6)游离态
    无。

 

你可能感兴趣的:(Hibernate 专题研究系列(一) save/update/saveOrUpdate等方法学习(续二))