摘要:和就是針對的一級緩存的處理。事務(wù)對數(shù)據(jù)的操作都是封裝在事務(wù)當中的,并且默認是非自動提交的方式。所以對保存對象時,如果不開啟事務(wù),并且手工提交事務(wù),對象并不會真正保存在數(shù)據(jù)庫中。
ORM
全稱Object/Relationship Mapping(對象/關(guān)系映射)
為何引入ORMJava、C++等許多語言是面向?qū)ο蟮木幊趟枷?,但是底層?shù)據(jù)庫往往是關(guān)系型數(shù)據(jù)庫,為了往數(shù)據(jù)庫中插入數(shù)據(jù),需要編寫相應(yīng)的sql語句。比如向一張學(xué)生表中插入一條數(shù)據(jù)(包含學(xué)生的基本信息:姓名、年齡、家庭住址等)
insert into students values(1,"張三豐","16","男","1977-4-3","武當山屠龍館")
這種在程序中大量插入SQL語句的方式有很多弊病,因為對于SQL語句來說,存在以下問題:
不同數(shù)據(jù)庫使用的SQL語句不同,比如mysql、SQL Server(微軟的產(chǎn)品)
同樣的功能,在不同數(shù)據(jù)庫中實現(xiàn)方式不同。因為不同數(shù)據(jù)庫產(chǎn)品封裝的不一樣
因此,如果程序中寫入大量SQL語句,將對程序的移植、維護帶來很多麻煩。ORM就是這樣誕生的,其目的是讓程序員拋棄在程序中直接書寫SQL的思想,完全使用面向?qū)ο蟮乃枷雭黹_發(fā)軟件。Hibernate就是一種ORM框架
Hibernate關(guān)系數(shù)據(jù)庫:可以簡單的理解為二維數(shù)據(jù)庫。復(fù)雜來說,是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫(關(guān)系模型是1970年由IBM研究員E.F.Codd博士首先提出的,并逐漸發(fā)展為數(shù)據(jù)庫架構(gòu)的主流模型),一般而言,關(guān)系模型指的就是二維表格模型,而一個關(guān)系型數(shù)據(jù)庫就是由二維表格和它們之間的聯(lián)系組成的一個數(shù)據(jù)組織
題外話: 經(jīng)常看到除了關(guān)系型數(shù)據(jù)庫,還有一種非關(guān)系型數(shù)據(jù)庫,其實這是一種誤解。其英文為:NoSQL(全稱:Not Only SQL),所以叫它不僅僅是SQL或者超關(guān)系型數(shù)據(jù)庫都行,不知道為什么就翻譯成了非關(guān)系型數(shù)據(jù)庫。畢竟這個“非”字導(dǎo)致了很多理解困難
Hibernate是Java領(lǐng)域的一款開源ORM框架技術(shù),對JDBC進行了輕量級的對象封裝
不建議直接使用jdbc的connection來操作數(shù)據(jù)庫,而是使用session,可以簡單認為,session就是操作數(shù)據(jù)庫的對象。
要想把數(shù)據(jù)保存在關(guān)系型數(shù)據(jù)庫中,需要調(diào)用session的各種方法,如:save()、update()等
通常有兩種方法,這兩種方法都是sessionFactory中的
1) openSession
2) getCurrentSession
如果使用getCurrentSession,需要在hibernate.cfg.xml文件中進行配置:
如果是本地事務(wù)(jdbc事務(wù))
如果是全局事務(wù)(jta事務(wù))
getCurrentSession在事務(wù)提交或者回滾之后會自動關(guān)閉;而openSession需要手動關(guān)閉,如果未進行手動關(guān)閉,多次之后會導(dǎo)致連接池溢出
openSession每次都會創(chuàng)建新的session對象,getCurrentSession則使用先用的session對象
session操作hibernate會把符合條件的數(shù)據(jù)寄存到內(nèi)存上,那么也就存在一個對內(nèi)存的管理,而session是有一級緩存(強制默認開啟),其目的是為了減少查詢數(shù)據(jù)庫的時間,提高效率,一級緩存的生命周期和session是一樣的。session.flush()和session.clear()就是針對session的一級緩存的處理。
簡單來說:
session.flush()的作用就是將session緩存(在內(nèi)存里)中的數(shù)據(jù)與數(shù)據(jù)庫同步。
session.clear()的作用就是清除session中的緩存數(shù)據(jù)(不管緩存與數(shù)據(jù)庫的同步)
session.evict(obj)的作用就是將指定的obj緩存對象進行清除
Flush方法可以通過flush方法強制進行從內(nèi)存到數(shù)據(jù)庫的同步,主要分為了兩步:清理緩存,執(zhí)行SQL。例如:
public void testFlush(){ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.get(Teacher.class, 3); t.setName("yyy"); session.flush();//有flush會執(zhí)行2次UPDAE,沒有會只執(zhí)行一次 t.setName("yyyyy"); session.getTransaction().commit(); }
Flush方法是可以設(shè)置的,也就是 fulsh 什么時候執(zhí)行是可以設(shè)置的,在session.beginTransaction 代碼前設(shè)置 FlushMode
session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL);
這里 FlushMode 有 5 個值可選:
Always: 任何代碼都會 Flush
AUTO: 默認方式 – 自動
Commit: COMMIT 時
Never: 始終不
MANUAL: 手動方式
設(shè)置 FlushMode 有個好處是可以節(jié)省開銷,比如默認 session 只做查詢時,就可以不讓他與數(shù)據(jù)庫同步了。
注意:執(zhí)行完session.flush()時,并不意味著數(shù)據(jù)就肯定持久化到數(shù)據(jù)庫中的,因為事務(wù)控制著數(shù)據(jù)庫,如果事務(wù)提交失敗了,緩存中的數(shù)據(jù)還是照樣會被回滾的。transaction(事務(wù))
hibernate對數(shù)據(jù)的操作都是封裝在事務(wù)當中的,并且默認是非自動提交的方式。所以對session保存對象時,如果不開啟事務(wù),并且手工提交事務(wù),對象并不會真正保存在數(shù)據(jù)庫中。
如果想讓hibernate像JDBC那樣自動提交事務(wù),必須調(diào)用session對象的doWork()方法,獲得jdbc的connection后,設(shè)置為自動提交事務(wù)模式(注意:通常不推薦這么做)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68240.html
摘要:初次使用的人往往會困惑,不知道該使用哪種方法。目前來說,團隊推薦使用基于的方法來提供更高的靈活性。配置,從而在應(yīng)用啟動時執(zhí)行腳本來初始化數(shù)據(jù)庫。目前為止我們沒有任何消息需要配置,所以只在文件夾中創(chuàng)建一個空的文件。將配置為,它包含的上下文。 前言 spring是一個用于創(chuàng)建web和企業(yè)應(yīng)用的一個很流行的框架。和別的只關(guān)注于一點的框架不同,Spring框架通過投資并組合項目提供了大量的功能...
摘要:對于大多數(shù)典型的企業(yè)應(yīng)用而言,其性能表現(xiàn)幾乎完全依賴于持久層的性能。速成法使用批處理對于批處理程序,驅(qū)動程序提供了旨在減少網(wǎng)絡(luò)來回傳輸?shù)膬?yōu)化方法。速成法檢查錯誤的提交間隔如果你使用批處理程序,提交間隔會對性能造成十倍甚至百倍的影響。 對于大多數(shù)典型的 Spring/Hibernate 企業(yè)應(yīng)用而言,其性能表現(xiàn)幾乎完全依賴于持久層的性能。此篇文章中將介紹如何確認應(yīng)用是否受數(shù)據(jù)庫約束,同時...
摘要:初步使用主要使用注解的方式對進行校驗,第一個例子在需要校驗的字段上指定約束條件然后在中可以這樣調(diào)用,加上注解即可。如果校驗失敗,默認會返回框架的出錯信息。指定到的分組名會全部進行校驗,不指定的不校驗。 Spring Boot - 表單校驗(JSR303&Hibernate Validator) 回顧 Spring Boot - 初識 Hello World Spring Boot -...
摘要:可能有人認為數(shù)據(jù)校驗?zāi)K并不是那么的重要,因為硬編碼都可以做。我以數(shù)據(jù)綁定為引子引出了數(shù)據(jù)校驗這一塊,是想表明它的重要性。關(guān)于數(shù)據(jù)校驗這塊,最新的是,也就是我們常說的。 每篇一句 吾皇一日不退役,爾等都是臣子 對Spring感興趣可掃碼加入wx群:Java高工、架構(gòu)師3群(文末有二維碼) 前言 前幾篇文章在講Spring的數(shù)據(jù)綁定的時候,多次提到過數(shù)據(jù)校驗??赡苡腥苏J為數(shù)據(jù)校驗?zāi)K...
閱讀 2794·2021-11-22 13:54
閱讀 2731·2021-10-14 09:42
閱讀 4098·2021-09-28 09:47
閱讀 2197·2021-09-03 10:28
閱讀 1234·2021-07-26 23:38
閱讀 2590·2019-08-30 15:54
閱讀 2663·2019-08-29 16:35
閱讀 1453·2019-08-29 15:42