Hibernate中重要對象的詳解

★→→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接口)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章