资讯专栏INFORMATION COLUMN

Hibernate flush理解

noONE / 3396人阅读

摘要:问题在框架没有事务的情况下,通过的,无法将数据持久化至数据库中,即使强制刷新后后也同样如此。原因混淆了框架中事务和事务的概念。对于增删改操作,必须后才能持久化至数据库。除非执行提交了事务。执行之后无法进行回滚。

问题

在spring框架没有事务的情况下,通过hibernate的session.save(entity),无法将数据持久化至数据库中,即使强制刷新后(flush())后也同样如此。

原因

混淆了spring框架中事务和mysql事务的概念。对于增删改操作,必须commit后才能持久化至mysql数据库。若不commit,只有在同一个连接中才能看到最新的更改,对其他连接不可见。

扩展 Hibernate的flush

执行时会清除session缓存并向数据库发送SQL语句并执行,但此时如果数据库当前存在一个事务,数据库会先将这些SQL语句缓存起来,那么此时在数据库中是无法看到SQL语句执行结果的。除非执行commit提交了事务。只要没有执行commit()方法,就能通过rollback()方法进行回滚。

Hibernate的commit

执行时会先隐式调用flush()方法,再提交事务。执行之后无法rollback()进行回滚。即commit操作才是真正的将实体数据持久化至数据库。

总结

通过hibernate进行数据库连接时,autocommit默认是false,因此仅仅做flush()是无法将数据持久化至数据库的,必须显式调用commit方法。
而如果使用jdbcTemplate进行数据库连接的话,无需显式执行commit方法,因为此时autocommit默认为true。通过以下代码验证之:

Connection conn = DriverManager.getConnection(JdbcTest.URL, JdbcTest.USER, JdbcTest.PWD); // 通过JDBC进行连接
SessionFactory sFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); 
Session session = sFactory.openSession(conn); // 使用jdbc的连接初始化hibernate的session
System.out.println(session.connection().getAutoCommit()); // autoCommit默认为true

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78254.html

相关文章

  • Hibernate快速了解

    摘要:和就是针对的一级缓存的处理。事务对数据的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以对保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。 ORM 全称Object/Relationship Mapping(对象/关系映射) 为何引入ORM Java、C++等许多语言是面向对象的编程思想,但是底层数据库往往是关系型数据库,为了往数据库中插入数据,需...

    selfimpr 评论0 收藏0
  • Hibernate【缓存】知识要点

    摘要:对象状态中对象的状态临时瞬时状态持久化状态游离状态学习的对象状态是为了更清晰地知道的设计思想,以及是一级缓存的基础当然啦,也就一点点知识临时瞬时状态当我们直接出来的对象就是临时瞬时状态的该对象还没有被持久化没有保存在数据库中不受的管理持久化 对象状态 Hibernate中对象的状态: 临时/瞬时状态 持久化状态 游离状态 学习Hibernate的对象状态是为了更清晰地知道Hiber...

    AlphaWallet 评论0 收藏0
  • Spring/Hibernate 应用性能优化的7种方法

    摘要:对于大多数典型的企业应用而言,其性能表现几乎完全依赖于持久层的性能。速成法使用批处理对于批处理程序,驱动程序提供了旨在减少网络来回传输的优化方法。速成法检查错误的提交间隔如果你使用批处理程序,提交间隔会对性能造成十倍甚至百倍的影响。 对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能。此篇文章中将介绍如何确认应用是否受数据库约束,同时...

    lavor 评论0 收藏0
  • Hibernate问题集锦

    摘要:查询照样写就行,如下参考问题七中关于多表连接查询和返回值集合中对象问题错误的查询语句释放分析原来是查询出来的字段并不能自动转换为对象。参考问题八原因原生的语句中返回值为,而语句中的返回值位型的,网上说的主要是兼容而做的。 首先奉上Hibernate3.2 API地址:http://docs.jboss.org/hiberna...Hibernate4.3 API地址:http://do...

    niceforbear 评论0 收藏0
  • Hibernate配置及自定义注册映射文件

    摘要:一配置属性详解可以在各式各样不同环境下工作而设计的因此存在着大量的配置参数。以简便操作,多数配置参数都有默认的配置值也是我们日常使用的必须品。 Hibernate (开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装, 它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernat...

    coordinate35 评论0 收藏0

发表评论

0条评论

noONE

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<