天天看點

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;

}

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接口)