`
androider
  • 浏览: 744354 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

hibernate执行的顺序

阅读更多
session.evict(obj),会把指定的缓冲对象进行清除
session.clear(),把缓冲区内的全部对象清除,但不包括操作中的对象

hibernate执行的顺序:

(1)生成一个事务的对象,并标记当前的Session处于事务状态(注:此时并未启动数据库级事务)。

(2)应用使用s.save保存对象,这个时候Session将这个对象放入entityEntries,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作,Session还要在insertions中登记应用的这个插入行为(行为包括:对象引用、对象id、Session、持久化处理类)。

(3)s.evict将对象从s会话中拆离,这时s会从entityEntries中将这个对象移出。

(4)事务提交,需要将所有缓存flush入数据库,Session启动一个事务,并按照insert,update,……,delete的顺序提交所有之前登记的操作(注意:所有insert执行完毕后才会执行update,这里的特殊处理也可能会将你的程序搞得一团糟,如需要控制操作的执行顺序,要善于使用flush),现在对象不在entityEntries中,但在执行insert的行为时只需要访问insertions就足够了,所以此时不会有任何的异常。异常出现在插入后通知Session该对象已经插入完毕这个步骤上,这个步骤中需要将entityEntries中对象的existsInDatabase标志置为true,由于对象并不存在于entityEntries中,此时Hibernate就认为insertions和entityEntries可能因为线程安全的问题产生了不同步(也不知道Hibernate的开发者是否考虑到例子中的处理方式,如果没有的话,这也许算是一个bug吧),于是一个net.sf.hibernate.AssertionFailure就被抛出,程序终止

一般错误的认为s.save会立即的执行,而将对象过早的与Session拆离,造成了Session的insertions和entityEntries中内容的不同步。所以我们在做此类操作时一定要清楚Hibernate什么时候会将数据flush入数据库,在未flush之前不要将已进行操作的对象从Session上拆离。

解决办法是在save之后,添加session.flush
分享到:
评论

相关推荐

    Hibernate事务(源码)

    **Hibernate事务管理详解** 在Java开发中,尤其是在企业级应用中,事务管理是不可或缺的一部分。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了强大的事务处理能力。本篇文章将深入探讨Hibernate中的事务...

    hibernate实战 英文版

    5. **查询语言**:Hibernate提供了强大的查询语言HQL(Hibernate Query Language),用于执行复杂的数据库查询操作。 6. **高级特性**:除了基础功能之外,本书还涵盖了诸如懒加载、批量更新和删除等高级特性。 ###...

    Hibernate SQLQuery 本地查询

    在Java的持久化框架Hibernate中,SQLQuery是用于执行自定义SQL语句的重要工具,它允许开发者绕过ORM(对象关系映射)的抽象层,直接与数据库进行交互。这篇博客"Hibernate SQLQuery 本地查询"可能详细讲解了如何利用...

    Hibernate 参数设置一览表.doc

    9. **hibernate.order_updates**:当设置为`true`时,Hibernate会按主键顺序执行更新操作,以减少死锁的可能性。 10. **hibernate.generate_statistics**:如果开启,Hibernate会收集统计信息以帮助优化性能。这些...

    hibernate难点重点笔记

    uuid策略是通过系统生成一组全局唯一标识符,其优点在于插入速度快,但查找可能较慢,适合对主键无特定顺序要求的情况。native策略则是由数据库自身决定主键生成,比如在MySQL中通常是自增,这样在查找和删除数据时...

    Java Persistence with Hibernate

    - **Session与SessionFactory**:Session是Hibernate的核心接口之一,负责执行所有对数据库的操作;SessionFactory则用于创建Session实例,是一个重量级、线程安全的对象。 - **事务管理**:Hibernate支持本地事务和...

    virgo中添加hibernate需要的库

    6. **测试与调试**:启动Virgo服务器并测试应用程序,确保Hibernate能够正确地连接到数据库,执行查询,并处理ORM操作。如果遇到问题,检查日志输出,进行调试,可能需要调整配置或解决库之间的版本冲突。 以上就是...

    hibernate面试题大全

    这样,Hibernate执行的所有SQL语句都会在控制台上显示出来,便于调试和分析。但需要注意的是,这种做法会增加系统的运行负担,不利于性能优化,因此在生产环境中应谨慎使用。 ### Hibernate的缓存策略 Hibernate...

    hibernate_second2项目源码

    3. **级联操作的顺序**:级联操作是有顺序的,Hibernate会按照定义的顺序处理这些操作。在进行级联保存时,先保存或更新父对象,然后是子对象,确保关联关系的正确建立。 4. **性能考虑**:虽然级联操作方便,但...

    hibernate参数配置

    9. **hibernate.order_updates**: 开启后,Hibernate会按照主键顺序执行SQL更新,以降低并发环境下的死锁风险。 10. **hibernate.generate_statistics**: 当设置为`true`,Hibernate会收集性能统计信息,帮助优化...

    Hibernate Validator校验框架

    - 注意注解的顺序可能影响验证的执行顺序,根据需要调整。 综上所述,Hibernate Validator 是一个强大的校验框架,它为 Java 应用提供了标准化的数据验证方案,简化了验证逻辑的实现,提高了代码的可维护性和一致性...

    Hibernate 源代码及重要说明

    1. **阅读顺序**: 先从配置开始,理解Hibernate如何加载和解析配置文件,然后关注SessionFactory的创建,接着是Session的使用,最后是查询和事务处理。 2. **注释与文档**: Hibernate的源码注释相对丰富,配合官方...

    hibernate的flush机制

    直到Flush操作发生时,Hibernate会遍历`insertions`, `deletions`, `updates`等集合,按顺序生成并执行相应的SQL语句,完成数据的持久化过程。 #### 总结与建议 深入理解Hibernate的Flush机制,对于避免常见错误、...

    hibernate源码分析过程

    Hibernate 支持拦截器和事件处理,可以在对象的生命周期中执行特定的操作。 HQL Hibernate Query Language(HQL)是 Hibernate 的查询语言。HQL 可以使用面向对象的方式来查询对象,可以使用 from、where、order ...

    hibernate验证框架学习

    **CDI** (Contexts and Dependency Injection) 提供了一种简单的方式来集成 **Hibernate Validator**,使得验证逻辑可以在容器管理的范围内执行。 ##### 10.4 Java EE **Java EE** 平台本身也集成了 **Java Bean ...

    解决Hibernate中MySQL的中文排序

    然而,问题可能依然存在,因为Hibernate在执行SQL查询时默认使用的是数据库的默认排序规则,可能并非我们期望的中文排序。为解决这个问题,我们可以自定义SQL排序语句,或者在实体类的属性上添加注解来指定排序规则...

    Hibernate可选配置大全

    - **功能**:强制按主键顺序执行更新操作,减少并发冲突。 - **取值**:`true`或`false`。 - **用途**:在高并发环境下,提高事务处理的安全性。 ##### 11. hibernate.generate_statistics - **功能**:启用统计...

    Hibernate视频教程免费下载

    - Transaction:用于控制单元工作的边界,可以管理一组操作的执行顺序。 - Session管理:包括开启、提交或回滚事务,关闭会话等操作。 #### 三、持久化操作详解 - **保存操作**: - save()方法:将实体对象持久...

Global site tag (gtag.js) - Google Analytics