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