摘要:?jiǎn)栴}在框架沒有事務(wù)的情況下,通過的,無法將數(shù)據(jù)持久化至數(shù)據(jù)庫(kù)中,即使強(qiáng)制刷新后后也同樣如此。原因混淆了框架中事務(wù)和事務(wù)的概念。對(duì)于增刪改操作,必須后才能持久化至數(shù)據(jù)庫(kù)。除非執(zhí)行提交了事務(wù)。執(zhí)行之后無法進(jìn)行回滾。
問題
在spring框架沒有事務(wù)的情況下,通過hibernate的session.save(entity),無法將數(shù)據(jù)持久化至數(shù)據(jù)庫(kù)中,即使強(qiáng)制刷新后(flush())后也同樣如此。
原因混淆了spring框架中事務(wù)和mysql事務(wù)的概念。對(duì)于增刪改操作,必須commit后才能持久化至mysql數(shù)據(jù)庫(kù)。若不commit,只有在同一個(gè)連接中才能看到最新的更改,對(duì)其他連接不可見。
擴(kuò)展 Hibernate的flush執(zhí)行時(shí)會(huì)清除session緩存并向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句并執(zhí)行,但此時(shí)如果數(shù)據(jù)庫(kù)當(dāng)前存在一個(gè)事務(wù),數(shù)據(jù)庫(kù)會(huì)先將這些SQL語(yǔ)句緩存起來,那么此時(shí)在數(shù)據(jù)庫(kù)中是無法看到SQL語(yǔ)句執(zhí)行結(jié)果的。除非執(zhí)行commit提交了事務(wù)。只要沒有執(zhí)行commit()方法,就能通過rollback()方法進(jìn)行回滾。
Hibernate的commit執(zhí)行時(shí)會(huì)先隱式調(diào)用flush()方法,再提交事務(wù)。執(zhí)行之后無法rollback()進(jìn)行回滾。即commit操作才是真正的將實(shí)體數(shù)據(jù)持久化至數(shù)據(jù)庫(kù)。
總結(jié)通過hibernate進(jìn)行數(shù)據(jù)庫(kù)連接時(shí),autocommit默認(rèn)是false,因此僅僅做flush()是無法將數(shù)據(jù)持久化至數(shù)據(jù)庫(kù)的,必須顯式調(diào)用commit方法。
而如果使用jdbcTemplate進(jìn)行數(shù)據(jù)庫(kù)連接的話,無需顯式執(zhí)行commit方法,因?yàn)榇藭r(shí)autocommit默認(rèn)為true。通過以下代碼驗(yàn)證之:
Connection conn = DriverManager.getConnection(JdbcTest.URL, JdbcTest.USER, JdbcTest.PWD); // 通過JDBC進(jìn)行連接 SessionFactory sFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session session = sFactory.openSession(conn); // 使用jdbc的連接初始化hibernate的session System.out.println(session.connection().getAutoCommit()); // autoCommit默認(rèn)為true
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78254.html
摘要:和就是針對(duì)的一級(jí)緩存的處理。事務(wù)對(duì)數(shù)據(jù)的操作都是封裝在事務(wù)當(dāng)中的,并且默認(rèn)是非自動(dòng)提交的方式。所以對(duì)保存對(duì)象時(shí),如果不開啟事務(wù),并且手工提交事務(wù),對(duì)象并不會(huì)真正保存在數(shù)據(jù)庫(kù)中。 ORM 全稱Object/Relationship Mapping(對(duì)象/關(guān)系映射) 為何引入ORM Java、C++等許多語(yǔ)言是面向?qū)ο蟮木幊趟枷耄堑讓訑?shù)據(jù)庫(kù)往往是關(guān)系型數(shù)據(jù)庫(kù),為了往數(shù)據(jù)庫(kù)中插入數(shù)據(jù),需...
摘要:對(duì)象狀態(tài)中對(duì)象的狀態(tài)臨時(shí)瞬時(shí)狀態(tài)持久化狀態(tài)游離狀態(tài)學(xué)習(xí)的對(duì)象狀態(tài)是為了更清晰地知道的設(shè)計(jì)思想,以及是一級(jí)緩存的基礎(chǔ)當(dāng)然啦,也就一點(diǎn)點(diǎn)知識(shí)臨時(shí)瞬時(shí)狀態(tài)當(dāng)我們直接出來的對(duì)象就是臨時(shí)瞬時(shí)狀態(tài)的該對(duì)象還沒有被持久化沒有保存在數(shù)據(jù)庫(kù)中不受的管理持久化 對(duì)象狀態(tài) Hibernate中對(duì)象的狀態(tài): 臨時(shí)/瞬時(shí)狀態(tài) 持久化狀態(tài) 游離狀態(tài) 學(xué)習(xí)Hibernate的對(duì)象狀態(tài)是為了更清晰地知道Hiber...
摘要:對(duì)于大多數(shù)典型的企業(yè)應(yīng)用而言,其性能表現(xiàn)幾乎完全依賴于持久層的性能。速成法使用批處理對(duì)于批處理程序,驅(qū)動(dòng)程序提供了旨在減少網(wǎng)絡(luò)來回傳輸?shù)膬?yōu)化方法。速成法檢查錯(cuò)誤的提交間隔如果你使用批處理程序,提交間隔會(huì)對(duì)性能造成十倍甚至百倍的影響。 對(duì)于大多數(shù)典型的 Spring/Hibernate 企業(yè)應(yīng)用而言,其性能表現(xiàn)幾乎完全依賴于持久層的性能。此篇文章中將介紹如何確認(rèn)應(yīng)用是否受數(shù)據(jù)庫(kù)約束,同時(shí)...
摘要:查詢照樣寫就行,如下參考問題七中關(guān)于多表連接查詢和返回值集合中對(duì)象問題錯(cuò)誤的查詢語(yǔ)句釋放分析原來是查詢出來的字段并不能自動(dòng)轉(zhuǎn)換為對(duì)象。參考問題八原因原生的語(yǔ)句中返回值為,而語(yǔ)句中的返回值位型的,網(wǎng)上說的主要是兼容而做的。 首先奉上Hibernate3.2 API地址:http://docs.jboss.org/hiberna...Hibernate4.3 API地址:http://do...
摘要:一配置屬性詳解可以在各式各樣不同環(huán)境下工作而設(shè)計(jì)的因此存在著大量的配置參數(shù)。以簡(jiǎn)便操作,多數(shù)配置參數(shù)都有默認(rèn)的配置值也是我們?nèi)粘J褂玫谋仨毱贰? Hibernate (開放源代碼的對(duì)象關(guān)系映射框架) Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝, 它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernat...
閱讀 3590·2019-08-30 15:55
閱讀 1387·2019-08-29 16:20
閱讀 3669·2019-08-29 12:42
閱讀 2675·2019-08-26 10:35
閱讀 1025·2019-08-26 10:23
閱讀 3422·2019-08-23 18:32
閱讀 914·2019-08-23 18:32
閱讀 2906·2019-08-23 14:55