1
2
3
4
|
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對象
1
2
|
private static final Configuration cfg = new Configuration(); private static org.hibernate.SessionFactory sessionFactory; |
這兩個(gè)對象對整個(gè)應(yīng)用來說只有一個(gè)實(shí)例存在 因此為用戶的訪問定義一個(gè)本地線程變量:
1
|
private static final ThreadLocal threadLocal = new ThreadLocal(); |
該線程變量是靜態(tài)的 對每一個(gè)訪問該線程的用戶產(chǎn)生一個(gè)實(shí)例 這樣在要取得Session對象時(shí) 首先從當(dāng)前用戶的線程中取得Session對象 如果還沒有創(chuàng)建 則從SessionFactory中創(chuàng)建一個(gè)Session 此時(shí)會(huì)判斷SessionFactory對象是否已經(jīng)創(chuàng)建 該對象對這個(gè)應(yīng)用來說 只有一個(gè) 因此 只有第一次訪問該變量的用戶才會(huì)創(chuàng)建該對象
HibernateSessionFactory.java 取得Session對象的過程如下表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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對象 如果不存在 則創(chuàng)建Session對象 在創(chuàng)建Session對象時(shí) 首先要判斷系統(tǒng)是否已經(jīng)加載Configuration 如果沒有sessionFactory 則需要先創(chuàng)建該對象 創(chuàng)建完成的Session對象 需要保存在threadLocal中以供本次訪問線程的下一次調(diào)用
在關(guān)閉Session對象是 只需要從當(dāng)前線程中取得Session對象 關(guān)閉該對象 并置空本地線程變量即可
1
2
3
4
5
6
7
8
|
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)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:http://blog.chinaunix.net/uid-26284395-id-3049145.html