`
poethelasi
  • 浏览: 6069 次
文章分类
社区版块
存档分类
最新评论

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 merge、update与saveOrUpdate方法的区别

    ### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...

    hibernate 的saveOrUpdate

    `saveOrUpdate`是Hibernate提供的一种便捷方法,用于处理对象的保存或更新操作。在深入讲解`saveOrUpdate`之前,我们先理解一下Hibernate的基本概念。 在Hibernate中,实体类(Entity Class)代表数据库中的表,...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    `saveOrUpdate`是Hibernate提供的一个便捷方法,它的主要作用是根据对象当前的状态来决定执行`save()`还是`update()`操作。具体来说: - 如果对象是瞬时状态,`saveOrUpdate`会调用`save()`,为对象生成一个新的...

    save, saveOrUpdate, persist, merge, update 区别.docx

    在Java的持久化框架Hibernate中,管理对象与数据库之间的交互是通过一系列的方法完成的,其中包括`save()`, `saveOrUpdate()`, `persist()`, `merge()`, 和 `update()`。这些方法各有其特点和适用场景,理解它们的...

    Hibernate save() saveorupdate()的用法第1/2页

    ### Hibernate中的`save()`与`saveOrUpdate()`方法详解 #### 一、概述 在Java持久化框架Hibernate中,`save()`与`saveOrUpdate()`是非常重要的两个方法,它们用于处理对象的持久化操作。理解这两个方法的工作原理...

    Hibernate持久层方法汇总

    本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...

    Hibernate3框架系列 [ 1 ]

    - **创建(Create)**:使用Session的save()或saveOrUpdate()方法将对象持久化到数据库中。 - **读取(Read)**:通过Session的get()或load()方法获取对象,或者使用Query或Criteria API来执行查询操作。 - **...

    hibernate 重点知识原创

    例如,使用 `save()` 或 `saveOrUpdate()` 方法保存对象,`get()` 或 `load()` 方法获取对象,`update()` 更新对象,以及 `delete()` 删除对象。同时,Session 提供了事务管理能力,可以确保数据操作的原子性和一致...

    Hibernate方法总结

    在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...

    hibernate第一个hibernate

    学习完基础后,可深入研究Hibernate的高级特性,如 Criteria API、Hibernate Search 和 JPA 规范等。 总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。...

    hibernate常用方法集合

    Session提供了操作实体的方法,如`save()`, `saveOrUpdate()`, `update()`, `delete()`等。例如,`save()`方法用来持久化新对象,`saveOrUpdate()`判断对象是否已存在,如果不存在则保存,否则更新,`update()`更新...

    Hibernate3.3_学习笔记.doc.zip

    《Hibernate3.3_学习笔记》是一份详细记录了Hibernate3.3版本特性和使用方法的文档,旨在帮助开发者深入理解和应用这一强大的对象关系映射(ORM)框架。Hibernate是Java开发中的一个明星库,它简化了数据库操作,...

    spring hibernate整合的底层数据操作方法

    1. 增加(Insert):在Hibernate中,我们可以通过Session的`save()`或`saveOrUpdate()`方法来保存新对象到数据库。在Spring整合中,通常会在Service层调用DAO层的方法,如`userRepository.save(user)`。 2. 删除...

    Hibernate学习笔记第一次课

    【Hibernate学习笔记第一次课】 在本课程中,我们将深入探讨Hibernate框架的基础知识,这是一个流行的Java对象关系映射(ORM)工具,它简化了数据库与Java应用程序之间的交互。我们的重点是Hibernate 3.1版本,虽然...

    Hibernate学习笔记(培训学习时的笔记)

    2. Save/Update/Delete:Session提供了对实体的增删改操作,如save(), saveOrUpdate(), update(), delete()。 3. Flush:Session会定期或者在某些操作后自动将内存中的改变同步到数据库,也可以手动调用flush()方法...

    hibernate_reference中文/英文.pdf

    例如,`Session`接口是主要的持久化工作接口,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法加载实体,`update()`更新实体,`delete()`删除实体。 5. **查询语言HQL**:Hibernate Query ...

    hibernate的各种保存方式的区别

    当调用此方法时,Hibernate会生成一条SQL UPDATE语句来更新该对象对应数据库表中的记录。如果对象已经是持久化状态,则直接对其进行修改即可,无需显式调用`update`方法。 #### 三、update 和 saveOrUpdate 区别 -...

    hibernate入门学习笔记+源码

    5. **CRUD操作**: 插入(save()或saveOrUpdate())、更新(update())、查询(load()、get()、Criteria、HQL等)、删除(delete())。 6. **事务处理**: Hibernate支持自动和手动的事务管理,确保数据的一致性。 **...

Global site tag (gtag.js) - Google Analytics