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

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

阅读更多

 

7、Delete
1) 返回值
   void
 
2)事件监听处理类及重要代码
   DefaultDeleteEventListener
  public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {
     EntityEntry entityEntry = persistenceContext.getEntry( entity );
     if ( entityEntry == null ) {
            persister = source .getEntityPersister( event.getEntityName(), entity );
 
            if ( ForeignKeys.isTransient( persister.getEntityName(), entity, null, source ) ) {
                deleteTransientEntity( source, entity , event.isCascadeDeleteEnabled(), persister, transientEntities );
                 // EARLY EXIT!!!
                 return;
           }
            performDetachedEntityDeletionCheck( event );
 
           entityEntry = persistenceContext.addEntity(
                      entity,
                     ( persister.isMutable() ? Status.MANAGED : Status.READ_ONLY),
                      persister.getPropertyValues( entity ),
                      key,
                      version,
                     LockMode.NONE,
                      true,
                      persister,
                      false,
                      false
           );
     }
     else {
            if ( entityEntry.getStatus() == Status.DELETED || entityEntry.getStatus() == Status.GONE ) {
                 return;
           }
            persister = entityEntry.getPersister();
            id = entityEntry.getId();
            version = entityEntry.getVersion();
     }
 
     deleteEntity(
                 source,
                 entity,
                entityEntry,
                event.isCascadeDeleteEnabled(),
                event.isOrphanRemovalBeforeUpdates(),
                 persister,
                transientEntities
     );
   }  
 
3)事务范围外的处理方式
   如果在事务范围外,delete不会得到执行;delete操作,只是把EntityDeleteAction加入到ActionQueue中的deletions队列中,detetions实际上是一个ArrayList;直到flush时才会执行。
   当然当实体是持久态/游离态时,才会将EntityDeleteAction加入到ActionQueue队列中。
 
4)瞬时态
   可以删除一个瞬时态的实体,处理过程是将瞬时对象加入瞬时对象列表中,然后执行相关级联操作。处理程序不会对瞬时对象在StatefulPersistenceContext中做任何处理。完成删除操作时,
   实体状态仍旧是瞬时态。
 
5)游离态
   如果在StatefulPersistenceContext找不到实体对应的EntityEntry,且实体的关键列值为null或与unsaved-value相等,则认为该实体为游离态,则作为游离态对象进行处理。
   创建对象EntityEntry加入StatefulPersistenceContext中,并将EntityDeleteAction加入到ActionQueue队列中。将实体状态标识为DELETED状态。直到commit前,实体一直是DELETED状态,
   事务提交后,将会变成DETACHED(游离)状态。
 
6)持久态
   如果在StatefulPersistenceContext找得到实体对应的EntityEntry,且实体的状态不为DELETED或GONE状态,则认为是持久态,进行持久态对象处理过程。
   将EntityDeleteAction加入到ActionQueue队列中。将实体状态标识为DELETED状态。直到commit前,实体一直是DELETED状态,事务提交后,将会变成DETACHED(游离)状态。
 
7)总结
 
8、Flush
1) 返回值
   void
 
2)事件监听处理类及重要代码
   DefaultFlushEventListener
public void onFlush(FlushEvent event) throws HibernateException {
     final EventSource source = event.getSession();
     final PersistenceContext persistenceContext = source.getPersistenceContext();
 
     if ( persistenceContext.getNumberOfManagedEntities() > 0 ||
                persistenceContext.getCollectionEntries().size() > 0 ) {
 
            try {
                source.getEventListenerManager().flushStart();
 
                 flushEverythingToExecutions( event ); // 将entities和collections的相应动作加入ActionQueue中
                 performExecutions( source ); // 然后执行ActionQueue所有的Actions
                 postFlush( source );
           }
            finally {
                source.getEventListenerManager().flushEnd(
                           event.getNumberOfEntitiesProcessed(),
                          event.getNumberOfCollectionsProcessed()
                );
           }
 
            postPostFlush( source );
 
            if ( source.getFactory().getStatistics().isStatisticsEnabled() ) {
                source.getFactory().getStatisticsImplementor().flush();
           }
     }
}
 
ActionQueue
private <E extends Executable & Comparable<?> & Serializable> void executeActions(ExecutableList<E> list) throws HibernateException {
     // todo : consider ways to improve the double iteration of Executables here:
     //         1) we explicitly iterate list here to perform Executable#execute()
     //         2) ExecutableList#getQuerySpaces also iterates the Executables to collect query spaces.
     try {
            for ( E e : list ) {
                 try {
                     e.execute();
                }
                 finally {
                      beforeTransactionProcesses.register( e.getBeforeTransactionCompletionProcess() );
                      afterTransactionProcesses.register( e.getAfterTransactionCompletionProcess() );
                }
           }
     }
     finally {
            if ( session.getFactory().getSettings().isQueryCacheEnabled() ) {
                 // Strictly speaking, only a subset of the list may have been processed if a RuntimeException occurs.
                 // We still invalidate all spaces. I don't see this as a big deal - after all, RuntimeExceptions are
                 // unexpected.
                Set<Serializable> propertySpaces = list.getQuerySpaces();
                 invalidateSpaces( propertySpaces.toArray( new Serializable[propertySpaces.size()] ) );
           }
     }
 
     list.clear();
     session.getTransactionCoordinator().getJdbcCoordinator().executeBatch();
}
 
3)事务范围外的处理方式
3.1) 设置connection为自动提交
假如,没有显式地创建一个事务并开启,然后对一个游离态对象进行delete操作,即该操作不在事务范围内,如果不执行flush操作,delete动作不会得到执行; 如果执行flush操作,
由于事务为自动提交,delete操作的delete sql将执行并提交至数据库。没有显式事务同样可以提交数据更新,不只是save,还有delete、update、persist、merge操作。
3.2)设置connection为非自动提交
假如,没有显式地创建一个事务并开启,然后对一个游离态对象进行delete操作,即该操作不在事务范围内,如果不执行flush操作,delete动作不会得到执行; 如果执行flush操作,
由于事务为手动提交,delete操作的delete sql将执行但事务得不到提交。
3.3)flush的作用
除了DefaultSaveOrUpdateEventListener中个别的情况外,其他的操作如update、persist、merge、delete等,只是将相应的Action加入到ActionQueue各自的队列中,并不会立即执行
相应的数据库操作。这里说的DefaultSaveOrUpdateEventListener中个别情况是指,save 操作在有些情况下不是将Action加入到ActionQueue中,而是直接执行Insert sql 操作并更新至
据库中。所以,一般情况下,只有等到flush时,Actions才会得到执行。flush的作用就是执行ActionQueue中的各种Action。
3.4)flush与commit的区别
3.4.1)commit包含flush操作,但处理的东西比flush多;commit还要执行关闭当前事务,开启新事务的工作。一旦当前事务提交,该事务就结束了,就不可再用了。
3.4.2)flush操作只是执行ActionQueue中的Action,执行完Action之后,将对ActionQueue进行清空避免同一操作多次被执行。
3.4.3)flush操作在显式地事务范围内时,可以执行多次,对事务本身没有影响,当前事务不会关闭,还处于活跃中;只是执行并清空的ActionQueue队列中的Action。
3.4.4)就算没有显式的事务,flush操作同样可以更新数据库,只要Connection.setAutoCommit(true);
3.4.5)没有Transaction,就没有commit方法;但没有Transaction,可以执行flush方法。
 
4)瞬时态
 
5)持久态
 
6)游离态

 

分享到:
评论

相关推荐

    Hibernate merge、update与saveOrUpdate方法的区别

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

    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三种状态

    其次,持久状态(Persistent)意味着对象已经通过Session的save()、saveOrUpdate()等方法保存到数据库,并且仍然在Hibernate的缓存管理中。在这种状态下,对象的任何改动在事务提交时会被自动同步到数据库。例如,...

    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常用方法集合

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

    hibernate的各种保存方式的区别

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

    hibernate对象三种状态

    在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...

    hibernate_reference中文/英文.pdf

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

    hibernate入门学习笔记+源码

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

Global site tag (gtag.js) - Google Analytics