成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hibernate快速了解

selfimpr / 2032人閱讀

摘要:和就是針對的一級緩存的處理。事務(wù)對數(shù)據(jù)的操作都是封裝在事務(wù)當中的,并且默認是非自動提交的方式。所以對保存對象時,如果不開啟事務(wù),并且手工提交事務(wù),對象并不會真正保存在數(shù)據(jù)庫中。

ORM

全稱Object/Relationship Mapping(對象/關(guān)系映射)

為何引入ORM

Java、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框架

關(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

Hibernate是Java領(lǐng)域的一款開源ORM框架技術(shù),對JDBC進行了輕量級的對象封裝

執(zhí)行流程

Session(會話)

不建議直接使用jdbc的connection來操作數(shù)據(jù)庫,而是使用session,可以簡單認為,session就是操作數(shù)據(jù)庫的對象。
要想把數(shù)據(jù)保存在關(guān)系型數(shù)據(jù)庫中,需要調(diào)用session的各種方法,如:save()、update()等

如何獲取session對象

通常有兩種方法,這兩種方法都是sessionFactory中的
1) openSession
2) getCurrentSession
如果使用getCurrentSession,需要在hibernate.cfg.xml文件中進行配置:
如果是本地事務(wù)(jdbc事務(wù))
thread
如果是全局事務(wù)(jta事務(wù))
jta

openSession和getCurrentSession

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

相關(guān)文章

  • 貓頭鷹的深夜翻譯:為什么要使用Spring Boot?

    摘要:初次使用的人往往會困惑,不知道該使用哪種方法。目前來說,團隊推薦使用基于的方法來提供更高的靈活性。配置,從而在應(yīng)用啟動時執(zhí)行腳本來初始化數(shù)據(jù)庫。目前為止我們沒有任何消息需要配置,所以只在文件夾中創(chuàng)建一個空的文件。將配置為,它包含的上下文。 前言 spring是一個用于創(chuàng)建web和企業(yè)應(yīng)用的一個很流行的框架。和別的只關(guān)注于一點的框架不同,Spring框架通過投資并組合項目提供了大量的功能...

    Jaden 評論0 收藏0
  • Spring/Hibernate 應(yīng)用性能優(yōu)化的7種方法

    摘要:對于大多數(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ù)庫約束,同時...

    lavor 評論0 收藏0
  • Spring Boot - 表單校驗(JSR303&Hibernate Validator)

    摘要:初步使用主要使用注解的方式對進行校驗,第一個例子在需要校驗的字段上指定約束條件然后在中可以這樣調(diào)用,加上注解即可。如果校驗失敗,默認會返回框架的出錯信息。指定到的分組名會全部進行校驗,不指定的不校驗。 Spring Boot - 表單校驗(JSR303&Hibernate Validator) 回顧 Spring Boot - 初識 Hello World Spring Boot -...

    tinyq 評論0 收藏0
  • 深入了解數(shù)據(jù)校驗:Bean Validation 2.0(JSR380)

    摘要:可能有人認為數(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...

    wangtdgoodluck 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<