Hibernate的主要組件
主要的Hibernate組件
Configuration類
Configuration類啟動(dòng)Hibernate的運(yùn)行環(huán)境部分,用于加載映射文件以及為它們創(chuàng)建一個(gè)SessionFacotry。完成這兩項(xiàng)功能后,就可丟棄Configuration類。
// 從hibernate.cfg.xml創(chuàng)建SessionFactory 示例
sessionFactory = new Configuration().configure()
.buildSessionFactory();
SessionFactory類
Hibernate中Session表示到數(shù)據(jù)庫(kù)的連接(不止于此),而SessionFactory接口提供Session類的實(shí)例。
SessionFactory實(shí)例是線程安全的,通常在整個(gè)應(yīng)用程序中共享。
從Configuration創(chuàng)建SessionFacotry的代碼如右。
// 從hibernate.cfg.xml創(chuàng)建SessionFactory 示例
SessionFactory sessionFactory = new Configuration().configure()
.buildSessionFactory();
Session類
Session表示到數(shù)據(jù)庫(kù)的連接,session類的實(shí)例是到Hibernate框架的主要接口,使你能夠持久化對(duì)象,查詢持久化以及將持久化對(duì)象轉(zhuǎn)換為臨時(shí)對(duì)象。
Session實(shí)例不是線程安全的,只能將其用于應(yīng)用中的事務(wù)和工作單元。
創(chuàng)建Session實(shí)例的代碼如右:
SessionFactory sessionFactory = new Configuration().configure()
.buildSessionFactory();
Session session=sessionFactory.openSession();
保存一個(gè)對(duì)象
用Hibernate持久化一個(gè)臨時(shí)對(duì)象也就是將它保存在Session實(shí)例中:
對(duì)user實(shí)例調(diào)用save時(shí),將給該實(shí)例分配一個(gè)生成的ID值,并持久化該實(shí)例,在此之前實(shí)例的id是null,之后具體的id由生成器策略決定,如果生成器類型是assignd,Hibernate將不會(huì)給其設(shè)置ID值。
Flush()方法將內(nèi)存中的持久化對(duì)象同步到數(shù)據(jù)庫(kù)。存儲(chǔ)對(duì)象時(shí),Session不會(huì)立即將其寫入數(shù)據(jù)庫(kù);相反,session將大量數(shù)據(jù)庫(kù)寫操作加入隊(duì)列,以最大限度的提高性能。
User user=new User(“Andy”,22);
Session session=sessionFatory.openSession();
session.save(user);
session.flush();
session.close();
保存或更新一個(gè)對(duì)象
Hibernate提供了一種便利的方法用于在你不清楚實(shí)例對(duì)應(yīng)的數(shù)據(jù)在數(shù)據(jù)庫(kù)中的狀態(tài)時(shí)保存或更新一個(gè)對(duì)象,也就是說,你不能確定具體是要保存save還是更新update,只能確定需要把對(duì)象同步到數(shù)據(jù)庫(kù)中。這個(gè)方法就是saveOrUpdate。
Hibernate在持久化時(shí)會(huì)查看實(shí)例的id屬性,如果其為null則判斷此對(duì)象是臨時(shí)的,在數(shù)據(jù)庫(kù)中找不到對(duì)應(yīng)的實(shí)例,其后選擇保存這個(gè)對(duì)象;而不為空時(shí)則意味著對(duì)象已經(jīng)持久化,應(yīng)該在數(shù)據(jù)庫(kù)中更新該對(duì)象,而不是將其插入。
User user=。。。;
Session session=sessionFatory.openSession();
session.saveOrUpdate(user);
Session.flush();
session.close();
刪除一個(gè)對(duì)象
從數(shù)據(jù)庫(kù)刪除一個(gè)對(duì)象使用session的delete方法,執(zhí)行刪除操作后,對(duì)象實(shí)例依然存在,但數(shù)據(jù)庫(kù)中對(duì)應(yīng)的記錄已經(jīng)被刪除。
User user=。。。;
Session session=sessionFatory.openSession();
session.delete(user);
session.flush();
session.close();
以ID從數(shù)據(jù)庫(kù)中取得一個(gè)對(duì)象
如果已經(jīng)知道一個(gè)對(duì)象的id,需要從數(shù)據(jù)庫(kù)中取得它,可以使用Session的load方法來返回它。代碼如右.
注意此放在id對(duì)應(yīng)的記錄不存在時(shí)會(huì)拋出一個(gè)HibernateException異常,它是一個(gè)非檢查性異常。對(duì)此的正確處理是捕獲這個(gè)異常并返回一個(gè)null。
使用此想法如果采用默認(rèn)的懶惰加載會(huì)導(dǎo)致異常,對(duì)此最簡(jiǎn)單的解決方案是把默認(rèn)的懶惰加載屬性修改為false。如右:
User user=(User)session.load(User.class,"008");
session.close();
-----------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.auction">
<class name="com.sitinspring.domain.User"
table="USERTABLE_OKB" lazy="false">
<id name="id" column="ID" >
<generator class="uuid.hex"/>
</id>
。。。。
</class>
</hibernate-mapping>
檢索一批對(duì)象
檢索一批對(duì)象需要使用HQL,session接口允許你創(chuàng)建Query對(duì)象以檢索持久化對(duì)象,HQL是面向?qū)ο蟮模阈枰槍?duì)類和屬性來書寫你的HQL而不是表和字段名。
從數(shù)據(jù)庫(kù)中查詢所有用戶對(duì)象如下:
Query query=session.createQuery(“from User”);// 注意這里User是類名,from前沒有select。
List<User> users=(List<User>)query.list();
從數(shù)據(jù)庫(kù)中查詢名為“Andy”的用戶如下:
String name=“Andy”;
Query query=session.createQuery(“from User where name=‘”+name+”’”);
List<User> users=(List<User>)query.list();
以上方法類似于Statement的寫法,你還可以如下書寫:
Query query=session.createQuery("from User user where user.name = :name");
query.setString("name", “Andy");
List<User> users=(List<User>)query.list();
posted on 2008-04-30 16:50 和風(fēng)細(xì)雨 閱讀(1266) 評(píng)論(0) 編輯 收藏 所屬分類: Hibernate