Hibernate flush明白

题目

在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
    原文作者:skyarthur
    原文地址: https://segmentfault.com/a/1190000004101735
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞