★→→SessionFactory (org.hibernate.SessionFactory)
包含已經編譯的映射(mappings),是製造session的工廠,可能含有一些可以在
各個事務(transaction)之間共享的數據
(1) SessionFactory的緩存
可分為兩類:內置緩存和外置緩存.
SessionFactory的內置緩存中存放了Hibernate配置信息和映射元數據信息、同時也緩存了Hibernate自動生成的SQL語句等;
SessionFactory的外置緩存是一個可配置的緩存插件,在默認情況下,SessionFactory不會啟用這個緩存插件.外置緩存
能存放大量資料庫數據的拷貝,外置緩存的物理介質可以是內存或者硬碟.
(2) 只有一個數據存儲源,只需創建一個SessionFactory
SessionFactory就是個重量級對象,如果應用只有一個數據存儲源,只需創建一個SessionFactory實例,
因為隨意地創建SessionFactory實例會佔用大量內存空間.
但是當你的項目要操作多個資料庫時,那你必須為每個資料庫指定一個SessionFactory.
(3) Configuration的其他用法
Configuration的configure ()方法還支持帶參數的訪問方式,你可以指定hbm.xml文件的位置,而不是使用默認的classpath
下面的hibernate.cfg.xml這種方式,例如:
Configuration cfg = new Configuration().configure("myexample.xml");
★★→→Configuration
Configuration是hibernate的入口,在新建一個Configuration的實例的時候,hibernate會在classpath裡面查找
hibernate.properties文件,如果該文件存在,則將該文件的內容載入到一個Properties的實例GLOBAL_PROPERTIES裡面,
如果不存在,將列印信息:hibernate.properties not found
然後是將所有系統環境變數(System.getProperties())也添加到GLOBAL_PROPERTIES裡面.如果hibernate.properties文件存在,
系統還會驗證一下這個文件配置的有效性,對於一些已經不支持的配置參數,系統將列印警告信息.
(1) 作用---實現對Hibernate進行配置
Configuration介面的作用是對Hibernate進行配置,以及對它進行啟動
在Hibernate的啟動過程中,Configuration類的實例定位映射文檔的位置,讀取這些配置,然後創建一個SessionFactory對象.
根據Configuration對象創建一個SessionFactory對象
為了能創建一個SessionFactory對象,你必須在Hibernate初始化時創建一個Configuration類的實例,並將已寫好的映射文件交由它處理.
這樣,Configuration對象就可以創建一個SessionFactory對象,當SessionFactory對象創建成功后,Configuration對象就沒有用了,你可以簡單地拋棄它.
(2) 它是啟動hibernate的對象
雖然Configuration介面在整個Hibernate項目中只扮演著一個很小的角色,但它是啟動hibernate時你所遇到的第一個對象.
(3) Configuration config = new Configuration();
config.addClass(Customer.class);
sessionFactory = config.buildSessionFactory();
或者:
使用方法鏈編程風格,可以改寫為:
sessionFactory = new Configuration().buildSessionFactory().addClass(Customer.class).buildSessionFactory();
注意:
方法鏈編程風格能使應用程序代碼更加簡捷.在使用這種編程風格時,最好把每個調用方法放在不同的行,否則在跟蹤程序時,無法跳入每個調用方法中.
★★★→→Session(org.hibernate.Session)
(1) 單線程的,短壽命的對象,代表了一次會話的過程.實際上是把一個JDBC Connection打包
了,它可以包含一些持久化對象的緩存
看作介於數據連接與事物管理一種中間介面.
在hibernate的設計者中.他們將session看作介於數據連接與事物管理的一種中間介面
或者想象成一個持久對象的緩衝區
hibernate能檢測到這些持久對象的改變,並及時刷新資料庫
(2) 每一個Session實例和一個資料庫事務綁定
通常將每一個Session實例和一個數據處理庫事務綁定
就是說,每執行一個資料庫事務(操作),都應該先創建一個新的Session實例.
如果事務執行中出現異常,應該撤消事務.
不論事務執行成功與否,都應該調用Session的close()方法,從而釋放Session實例
佔用的資源.
(3) 如何獲得Session對象
創建SessionFactory對象
應用伺服器如果訪問多個數據源時,則應該產生多個SessionFactory;
但是僅僅為了服務與某個請求時,不要創建一個新的SessionFactory,因為創建
SessionFactory需要消耗大量的資源.
然後根據SessionFactory再創建Session對象
例如:::::
----------------------------------------------------------------------------------
Session session=sessionFactory.openSession();
Transaction tx;
try{
tx=session.beginTransaction();//開始一個事務
.......//執行事務
tx.commit();
}catch(Exception e){//如果出現異常就撤消事務
if(tx!=null)
tx.rollback();
throw e;
}
finally//不管事務執行成功與否,都關閉Session並且放在finally中以提高安全性
session.close();
-----------------------------------------------------------------------------------
(4) Sessin 介面中的常用方法
基本的CURD操作(save()方法:把Java對象保存資料庫中、update()方法:更新數據
庫中的Java對象、delete()方法:把Java對象從資料庫中刪除、load()方法:從數據
庫中載入Java對象 和find()方法:從資料庫中查詢Java對象);執行查詢;
◆ save()方法:save() 和persist()方法產生SQL INSERT
session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Book oneBook = new Book();
oneBook.setBookName(new String("J2EE應用開發".getBytes("gb2312"), "ISO8859-1"));
oneBook.setBookKind('1');
oneBook.setBookPrice(7.4f);
session.save(oneBook);
tx.commit();
◆ Sessin 介面中的常用方法---- updata()和merge()方法產生SQL UPDATE
該方法調用Session的load()方法,載入Customer對象,然後再修改Customer對象的屬性.
session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Book oneBook=(Book)session.load(Book.class,bookID);
oneBook.setBookName(new String("Java應用開發".getBytes("gb2312"), "ISO8859-1"));
oneBook.setBookKind('1');
oneBook.setBookPrice(10.4f);
tx.commit();
◆ Sessin 介面中的常用方法---- load和get方法
session的load和get方法根據給定的OID從資料庫中載入一個對象,load方法在沒有找 到對象時拋出notFoundException異常,get方法返回null;
get和load和其他查詢方法返回的對象位於session的緩存中,修改了對象的屬性后, session清理緩存時,會根據持久化對象的屬性來更新資料庫.
用來對資料庫中檢索對象,load()和get()方法按照給定的OID載入一個持久化對象
public Iterator getAllCourses()throws HibernateException
{
String queryString = "select courses from Course as courses";
beginTransaction();
Query query = session.createQuery(queryString);
Iterator it= query.iterate();
return it;
}
/**
*按course的名字進行模糊查找,返回的是包含有Course持久對象的Iterator.
*/
public Iterator getSomeCourse(String name)throws HibernateException
{
String queryString = "select c from Course as c where c.name like :name" ;
beginTransaction();
Query query = session.createQuery(queryString);
query.setString("name", "%" name "%");
Iterator it= query.iterate();
return it;
}
◆ Sessin 介面中的常用方法---- delete()方法產生SQL DELETE
由於從資料庫中刪除對象對應的記錄,如果出入的是持久化對象session就計劃執行一個delete語句.
如果出入的參數是遊離態對象,先使它成為持久化對象,然後計劃執行一個delete語句.session只有在清理緩存的時候才會執行delete語句.
只有當調用session的close()方法時才會從session的緩存中刪除對象.
session = HibernateUtil.currentSession();s
tx = session.beginTransaction();
Book oneBook=(Book)session.load(Book.class,bookID);
session.delete(oneBook);
tx.commit();
★★★★→→Transaction
★★★★★→→Query查詢對象
Query介面讓你方便地對資料庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地資料庫的SQL語句.
Query經常被用來綁定查詢參數、限制查詢記錄數量,並最終執行查詢操作.
Query query=session.createQuery();
List list = query.list();//把query查詢對象放到Query的list裡面,返回一個query對象
★★★★★★Callback 方面的介面
當一些有用的事件發生時――例如持久對象的載入、存儲、刪除時,Callback介面會通知Hibernate去接收一個通知消息---它允許
應用程序能對一些事件的發生作出相應的操作.例如Interceptor、Lifecycle和Validatable都是這一類介面.一般而言,
Callback介面在用戶程序中並不是必須的,但你要在你的項目中創建審計日誌時,你可能會用到它.
◎第一步.---->獲取Sessionfactory對象
Sessionfactory sf=new Configuration().configure().buildSessionFactory();
◎第二步.---->創建session對象
Session session=sf.openSession();
◎第三步.---->獲取對資料庫操作前的事物對象
Transaction tx=session.beginTransaction();
◎第四步.---->利用session的多個方法進行數據操作.例如:session.save(實體bean對象);session.update(實體bean對象)等;
◎第五步.---->tx.commit();保存持久化資料庫操作;
◎ 數據其他操作.比如查詢Query query=session.createQuery("from student where username='" username"'");//student為一個實體bean對象.就是與hbm.xml對應的和資料庫映射的一個 javabean.
其他介面::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::? 主鍵的生成 (IdentifierGenerator 介面)
# 本地SQL語言支持 (Dialect 抽象類)
# 緩衝機制 (Cache 和CacheProvider 介面)
# JDBC 連接管理 (ConnectionProvider介面)
# 事務管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 介面)
# ORM 策略 (ClassPersister 介面)
# 屬性訪問策略 (PropertyAccessor 介面)
# 代理對象的創建 (ProxyFactory介面)
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xuanlanbaicai/archive/2008/08/28/2845050.aspx
[火星人 ] Hibernate中重要對象的詳解已經有683次圍觀