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

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

 
阅读更多

 

知识准备 1
所有Entity实体在其hbm.xml配置文件中都必须设置Id元素或composite-id元素,不然hbm.xml文件会报错
因此,任何情况下Entity都拥有IdentifierGenerator对象,即关键列生成策略。
<id name="id" type="string">
    <column name="id"></column>
    <generator class ="guid"></generator>
</id>
 
知识准备 2
protected Serializable saveWithGeneratedId(
           Object entity,
           String entityName,
           Object anything,
           EventSource source,
            boolean requiresImmediateIdAccess) {
     EntityPersister persister = source.getEntityPersister( entityName, entity );
     Serializable generatedId = persister.getIdentifierGenerator().generate( source, entity );
     if ( generatedId == null ) {
            throw new IdentifierGenerationException( "null id generated for:" + entity.getClass() );
     }
     else if ( generatedId == IdentifierGeneratorHelper.SHORT_CIRCUIT_INDICATOR ) { 
            return source.getIdentifier( entity );
     }
     else if ( generatedId == IdentifierGeneratorHelper.POST_INSERT_INDICATOR ) {
            return performSave( entity, null, persister, true, anything, source, requiresImmediateIdAccess );
     }
     else {
            // TODO: define toString()s for generators
            if LOG.isDebugEnabled() ) {
                 LOG.debugf(
                            "Generated identifier: %s, using strategy: %s",
                          persister.getIdentifierType().toLoggableString( generatedId, source.getFactory() ),
                          persister.getIdentifierGenerator().getClass().getName()
                );
           }
 
            return performSave( entity, generatedId, persister, false, anything, source, true );
     }
}
 
generatedId 为null:说明hbm.xml没有配置id/composite-id列,直接抛出异常。
generatedId 为 SHORT_CIRCUIT_INDICATOR: 目前只有ForeignGenerator使用该类型。
generatedId 为 POST_INSERT_INDICATOR: 拥有SequenceGenerator、IdentityGenerator、SelectGenerator等三个,POST_INSERT_INDICATORuseIdentityColumn为true,
                                      即会选择EntityIdentityInsertAction。
generatedId 为其他的:如Assigned、GUIDGenerator等,将useIdentityColumn为true,即会选择EntityInsertAction。
 
知识准备 3
org.hibernate.event.internal.AbstractSaveEventListener 
 //所有子类都不会覆盖该方法、所以判断是否延迟执行数据库的逻辑封装在这里
protected Serializable performSaveOrReplicate
       Object entity,
       EntityKey key,
       EntityPersister persister,
       boolean useIdentityColumn,
       Object anything,
       EventSource source,
       boolean requiresImmediateIdAccess) {
    boolean inTxn = source.getTransactionCoordinator().isTransactionInProgress();
    boolean shouldDelayIdentityInserts = !inTxn && !requiresImmediateIdAccess;
 
   AbstractEntityInsertAction insert = addInsertAction(
       values, id, entity, persister, useIdentityColumn, source, shouldDelayIdentityInserts
   );
}
 
AbstractSaveEventListener 是 DefaultSaveOrUpdateEventListener、DefaultSaveEventListener、
DefaultUpdateEventListener、DefaultPersistEventListener、
DefaultMergeEventListener、DefaultReplicateEventListener的直接或间接父类。
所有子类都不会覆盖该方法、所以判断是否延迟执行数据库的逻辑封装在这里。
 
useIdentityColumn:关系到这两者EntityIdentityInsertAction和EntityInsertAction之间的选择。EntityIdentityInsertAction的isEarlyInsert()方法
                   根据inTxn和requiresImmediateIdAccess决定取值;EntityInsertAction的isEarlyInsert()方法永远返回false。返回false表示不立即
                   到数据库执行Insert Sql操作。
 
shouldDelayIdentityInserts:是否延迟进行操作数据库,只会影响EntityIdentityInsertAction的isEarlyInsert方法,不会影响到EntityInsertAction,
                            因为isEarlyInsert方法永远返回false。
 
 
知识准备 4
 
EntityIdentityInsertAction:对应由数据库生成关键字值id的insert操作。有可能立即执行,不需要等到flush或commit时。
EntityInsertAction:对应由程序生成关键字的Insert操作,没机会立即执行。需等到flush或commit时,才执行。
EntityUpdateAction:对应update操作。
EntityDeleteAction:对应delete操作。
 
知识准备 5
/**
 * Represents the status of an entity with respect to this session. These statuses are for internal
 * book -keeping only and are not intended to represent any notion that is visible to the _application_.
 */
public enum Status {
      MANAGED,
      READ_ONLY,
      DELETED,
      GONE,
      LOADING,
      SAVING
}
 
MANAGED和READ_ONLY:update时,将游离态对象转换为持久态时,需要将该Entity创建一个EntityEntry对象,并将其放入StatefulPersistenceContext中。
                    这时,将EntityEntry的Status标识为MANAGED和READ_ONLY。如果hbm中class的属性mutable设置true(默认为true,可变),则为
                    MANAGED,否则为READ_ONLY。
DELETED:delete时,首先把EntityDeleteAction放入ActionQueue队列,但未执行,并将该Entity对应的EntityEntry的Status标识为DELETED。
         表示已标示为删除,但未真正执行操作。
GONE:当flush和commit时,EntityDeleteAction真正得到执行,当执行完之后,将EntityEntry的Status标识为GONE。
SAVING:执行保存操作时,需要为Entity在StatefulPersistenceContext中创建一个EntityEntry,并将其Status标识为SAVING。
LOADING:数据Load时的标识。
 
知识准备 6
瞬时态、游离态、持久态、删除态的判断逻辑:
1)如果Entity在StatefulPersistenceContext中存在相应的EntityEntry对象,且EntityEntry的Status为DELETED,那么判断为删除态(DELETED);
2)如果Entity在StatefulPersistenceContext中存在相应的EntityEntry对象,且EntityEntry的Status不为DELETED,那么判断为持久态(PERSISTENT);
3)如果Entity在StatefulPersistenceContext中不存在相应的EntityEntry对象,如果Entity关键字值为null或与hbm文件中id元素配置的unsaved-value
   相等,那么判断为瞬时(TRANSIANT);
4)如果Entity在StatefulPersistenceContext中不存在相应的EntityEntry对象,除3)外,否则判断为游离态(DETACHED)。

 

分享到:
评论

相关推荐

    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的基本概念和操作。...

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

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

    hibernate常用方法集合

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

    Hibernate学习笔记第一次课

    - 创建(Create):使用Session的save()或saveOrUpdate()方法保存实体到数据库。 - 读取(Read):利用Session的get()或load()方法根据ID获取实体,query()方法用于执行HQL(Hibernate Query Language)查询。 - ...

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

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

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

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

    hibernate入门学习笔记+源码

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

    hibernate_reference中文/英文.pdf

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

    Hibernate基本实现

    - **创建(Create)**:使用Session的`save()`或`saveOrUpdate()`方法保存新对象到数据库。 ```java User user = new User("John Doe"); session.save(user); ``` - **读取(Read)**:通过Session的`get()`...

Global site tag (gtag.js) - Google Analytics