Hibernate flush理解

問題:在沒有事務的情況下,通過hibernate的session.save(entity),無法將數據持久化至數據庫中,即使強制刷新後(flush())後也同樣如此。

原因:對於增刪改操作,必須commit後才能持久化至數據庫。若不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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章