Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
Configuration cfg = new Configuration();
cfg.addResource("com/demo/hibernate/beans/User.hbm.xml");
cfg.setProperty(System.getProperties());
SessionFactory sessionFactory = cfg.buildSessionFactory();
SessionFactory用到了一個(gè)設(shè)計(jì)模式 工廠模式 用戶程序從工程類SessionFactory取得Session實(shí)例 設(shè)計(jì)者的意圖就是讓它能在整個(gè)應(yīng)用中共享 典型的來說 一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory就夠了 因此我們就設(shè)計(jì)了HibernateSessionFactory.java這個(gè)輔助類 定義了一個(gè)靜態(tài)的Configuration和SessionFactory對(duì)象
private static final Configuration cfg = new Configuration(); private static org.hibernate.SessionFactory sessionFactory;
這兩個(gè)對(duì)象對(duì)整個(gè)應(yīng)用來說只有一個(gè)實(shí)例存在 因此為用戶的訪問定義一個(gè)本地線程變量:
private static final ThreadLocal threadLocal = new ThreadLocal();
該線程變量是靜態(tài)的 對(duì)每一個(gè)訪問該線程的用戶產(chǎn)生一個(gè)實(shí)例 這樣在要取得Session對(duì)象時(shí) 首先從當(dāng)前用戶的線程中取得Session對(duì)象 如果還沒有創(chuàng)建 則從SessionFactory中創(chuàng)建一個(gè)Session 此時(shí)會(huì)判斷SessionFactory對(duì)象是否已經(jīng)創(chuàng)建 該對(duì)象對(duì)這個(gè)應(yīng)用來說 只有一個(gè) 因此 只有第一次訪問該變量的用戶才會(huì)創(chuàng)建該對(duì)象
HibernateSessionFactory.java 取得Session對(duì)象的過程如下表示
public static Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null) {
if (sessionFactory == null) {
try {
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
}
catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
首先判斷threadLocal中是否存在Session對(duì)象 如果不存在 則創(chuàng)建Session對(duì)象 在創(chuàng)建Session對(duì)象時(shí) 首先要判斷系統(tǒng)是否已經(jīng)加載Configuration 如果沒有sessionFactory 則需要先創(chuàng)建該對(duì)象 創(chuàng)建完成的Session對(duì)象 需要保存在threadLocal中以供本次訪問線程的下一次調(diào)用
在關(guān)閉Session對(duì)象是 只需要從當(dāng)前線程中取得Session對(duì)象 關(guān)閉該對(duì)象 并置空本地線程變量即可
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
到此這篇關(guān)于Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解的文章就介紹到這了,更多相關(guān)Java 使用SessionFactory創(chuàng)建Session內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea中創(chuàng)建新類時(shí)自動(dòng)添加注釋的實(shí)現(xiàn)
在每次使用idea創(chuàng)建一個(gè)新類時(shí),過了一段時(shí)間發(fā)現(xiàn)看不懂這個(gè)類是用來干嘛的,為了解決這個(gè)問題,我們可以設(shè)置在創(chuàng)建一個(gè)新類時(shí)自動(dòng)添加注釋,幫助我們理解這個(gè)類的用處,本文主要介紹了在idea中創(chuàng)建新類時(shí)自動(dòng)添加注釋的實(shí)現(xiàn),感興趣的可以了解一下2025-03-03
Java多態(tài)(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
多態(tài)是指允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式。接下來通過本文給大家介紹java多態(tài)相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2017-04-04
Java中數(shù)據(jù)轉(zhuǎn)換及字符串的“+”操作方法
本文主要介紹了Java中的數(shù)據(jù)類型轉(zhuǎn)換,包括隱式轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換,隱式轉(zhuǎn)換通常用于將范圍較小的數(shù)據(jù)類型轉(zhuǎn)換為范圍較大的數(shù)據(jù)類型,而強(qiáng)制轉(zhuǎn)換則是將范圍較大的數(shù)據(jù)類型轉(zhuǎn)換為范圍較小的數(shù)據(jù)類型,本文介紹Java中數(shù)據(jù)轉(zhuǎn)換以及字符串的“+”操作,感興趣的朋友一起看看吧2024-10-10
基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))
下面小編就為大家?guī)硪黄赗estful接口調(diào)用方法總結(jié)(超詳細(xì))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
Jackson java動(dòng)態(tài)去除返回json中的值方式
文章介紹了在Java中使用@JsonInclude注解動(dòng)態(tài)去除返回JSON中的非必需字段(如分頁信息)的解決方案,通過在字段上添加@JsonInclude注解并選擇合適的策略(如NON_NULL或NON_EMPTY),可以在非分頁情況下取消分頁字段,從而提高返回結(jié)果的靈活性和效率2024-12-12
MybatisPlus中@TableField注解的使用詳解
這篇文章主要介紹了MybatisPlus中@TableField注解的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

