溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

hibernate的sessionfactory是做什么的

發(fā)布時(shí)間:2021-12-06 09:07:59 來源:億速云 閱讀:279 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“hibernate的sessionfactory是做什么的”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

問:hibernate的sessionfactory是干嘛的?session又是干嘛的呢?

在回答這個(gè)問題之前,先來看看一些概念。

一、hibernate是什么?

Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用。    ----百度百科
其實(shí)我自己的理解是,使用hibernate,最常用的場(chǎng)景是,使用它的ORM機(jī)制,然后把傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)操作,轉(zhuǎn)換為面向?qū)ο蟮姆绞絹聿僮?。為什么這么做呢?在沒有使用到ORM之前。一個(gè)簡(jiǎn)單的例子,你在表單上,填了好多個(gè)數(shù)據(jù),姓名,性別,年齡。。。。。愛好等等等,然后你使用JDBC去連接數(shù)據(jù)庫(kù),接下來一條一條的把數(shù)據(jù)從request或者某個(gè)地方讀進(jìn)來,如果有100個(gè),表示需要定義100個(gè)變量來暫存這些表單數(shù)據(jù),然后在保存到數(shù)據(jù)庫(kù)中,在保存的時(shí)候,也要一下下的寫sql語句,再次傳100個(gè)值。。。如果是1000個(gè)。。想想就好累。
那么如果  有了ORM,是什么情況,  你只要把對(duì)應(yīng)的數(shù)據(jù)庫(kù)的表,映射為一個(gè)對(duì)象(比如student)。然后在表單對(duì)應(yīng)的input的name上,填寫對(duì)應(yīng)對(duì)象的對(duì)應(yīng)屬性(比如student.name),  然后在保存的時(shí)候,在  提交到的Action中,  定義一個(gè)student的對(duì)象實(shí)例,  那么這些數(shù)據(jù)就會(huì)自動(dòng)保存在這個(gè)對(duì)象中了。接下來,你  只需要保存一下這個(gè)對(duì)象就ok了。是不是感覺方便了好多。

二、什么是sessionfactory

SessionFactory接口負(fù)責(zé)初始化Hibernate。它  充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并  負(fù)責(zé)創(chuàng)建Session對(duì)象。這里用到了  工廠模式。需要注意的是SessionFactory并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory就夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫(kù)時(shí),可以為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory。                                        ----百度百科
我的理解是,其實(shí)顧名思義,sessionfactory,就是用來   創(chuàng)建session會(huì)話(具體接下來講)的工廠。想想有一個(gè)特別大的工廠,專門用來在你需要使用session的時(shí)候,讓它幫你創(chuàng)建一個(gè)就好了。(突然記起來一個(gè)冷笑話,如果你沒有對(duì)象怎么辦?辦法是,new一個(gè)出來唄。。額你沒有笑,我知道)。但是需要注意一下就是,一般來講,一個(gè)web工程(系統(tǒng)),如果涉及到的是一個(gè)數(shù)據(jù)庫(kù)(你在學(xué)校做項(xiàng)目,一般就一個(gè)吧。。。哈哈哈),那么本工程就只需要一個(gè)sessionfactory就夠了。這個(gè)工程所涉及到的所有的session,都交由這個(gè)sessionfactory來管理。

接下來,創(chuàng)建一個(gè)sessionfactory,一般有兩種創(chuàng)建方式,1.從XML文件讀取配置信息構(gòu)建SessionFactory,2.從Java屬性文件讀取配置信息構(gòu)建SessionFactory。

第一種:


1》實(shí)例化Configuration對(duì)象,默認(rèn)讀取src目錄下的hibernate.cfg.xml,配置文件

<span style="font-size:18px;">Configuration config = new Configuration().configure();</span>


或者在configure();中指明文件名稱和路徑

<span style="font-size:24px;">Configuration config = new Configuration().configure("hibernate.cfg.xml");</span>


2》現(xiàn)在這個(gè)config對(duì)象,已經(jīng)包括所有Hibernate運(yùn)行期的參數(shù),通過Configuration實(shí)例的buildSessionFactory()方法可以構(gòu)建一個(gè)惟一的SessionFactory:

<span style="font-size:24px;">SessionFactory sessionFactory = config.buildSessionFactory();</span>


第二種


1》創(chuàng)建一個(gè)Configuration對(duì)象,此時(shí)Hibernate會(huì)默認(rèn)加載classpath中的配置文件hibernate.properties,代碼如下。

Configuration config = new Configuration();


2》由于在配置文件中缺少相應(yīng)的配置映射文件的信息,所以此處需要通過編碼方式加載,這可以通過Configuration對(duì)象的addClass()方法實(shí)現(xiàn),具體代碼如下。

config.addClass(BranchForm.class);
 

addClass()方法用于加載實(shí)體類。


3》完成配置文件和映射文件的加載后,將得到一個(gè)包括所有Hibernate運(yùn)行期參數(shù)的Configuration實(shí)例,通過Configuration實(shí)例的buildSessionFactory()方法可以構(gòu)建一個(gè)惟一的SessionFactory,代碼如下。

SessionFactory sessionFactory = config.buildSessionFactory();
 

構(gòu)建SessionFactory要放在靜態(tài)代碼塊中,因?yàn)樗恍柙谠擃惐患虞d時(shí)執(zhí)行一次。

三、什么是Session

提起來Session的話,首先想到的是http這個(gè)東東的session,想到了http這個(gè)無狀態(tài)的協(xié)議,沒辦法保存任何訪問對(duì)象的信息,所以就出現(xiàn)了session這個(gè)東東,用來記錄訪問者的一些信息。   但是,好好轉(zhuǎn)折一下下,轉(zhuǎn)折,轉(zhuǎn)折,轉(zhuǎn)折說三遍。
在hibernate中的session   并不是http中所說的session,一般把HttpSession對(duì)象稱為用戶會(huì)話。。。
而hibernate中的Session呢?是用來表示,   應(yīng)用程序和   數(shù)據(jù)庫(kù)的一次交互(會(huì)話)。在這個(gè)Session中,包含了一般的持久化方法(CRUD),不要說不知道CRUD是什么。而且,Session是一個(gè)輕量級(jí)對(duì)象(線程不安全),通常將每個(gè)Session實(shí)例和一個(gè)數(shù)據(jù)庫(kù)事務(wù)綁定,也就是每執(zhí)行一個(gè)數(shù)據(jù)庫(kù)事務(wù),都應(yīng)該先創(chuàng)建一個(gè)新的Session實(shí)例,在使用Session后,還需要   關(guān)閉Session。   (記得關(guān)閉哈)  
接下來,創(chuàng)建一個(gè)Session對(duì)象,依據(jù)第二步得到的sessionfactory對(duì)象。  
 
<span style="font-size:24px;">Session session=sessionFactory.openSession();</span>


然后得到這個(gè)session之后,就可以使用它來進(jìn)行數(shù)據(jù)庫(kù)的具體操作了,給一個(gè)簡(jiǎn)單的代碼。多說一句,一般來說在使用session的時(shí)候,都會(huì)用到事務(wù),尤其是需要對(duì)數(shù)據(jù)做修改的時(shí)候。上代碼:

<span style="font-size:24px;">public void save(Student student) {    Transaction transaction= getSession().beginTransaction();  //開啟事務(wù)    getSession().save(student);//只要傳一個(gè)Student的對(duì)象實(shí)例            transaction.commit();  //事務(wù)提交     getSession().close();//關(guān)閉session}</span>

“hibernate的sessionfactory是做什么的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI