主要的Hibernate組件

Configuration類
Configuration類啟動Hibernate的運行環境部分,用于加載映射文件以及為它們創建一個SessionFacotry。完成這兩項功能后,就可丟棄Configuration類。
// 從hibernate.cfg.xml創建SessionFactory 示例
sessionFactory = new Configuration().configure()
.buildSessionFactory();
SessionFactory類
Hibernate中Session表示到數據庫的連接(不止于此),而SessionFactory接口提供Session類的實例。
SessionFactory實例是線程安全的,通常在整個應用程序中共享。
從Configuration創建SessionFacotry的代碼如右。
// 從hibernate.cfg.xml創建SessionFactory 示例
SessionFactory sessionFactory = new Configuration().configure()
.buildSessionFactory();
Session類
Session表示到數據庫的連接,session類的實例是到Hibernate框架的主要接口,使你能夠持久化對象,查詢持久化以及將持久化對象轉換為臨時對象。
Session實例不是線程安全的,只能將其用于應用中的事務和工作單元。
創建Session實例的代碼如右:
SessionFactory sessionFactory = new Configuration().configure()
.buildSessionFactory();
Session session=sessionFactory.openSession();
保存一個對象
用Hibernate持久化一個臨時對象也就是將它保存在Session實例中:
對user實例調用save時,將給該實例分配一個生成的ID值,并持久化該實例,在此之前實例的id是null,之后具體的id由生成器策略決定,如果生成器類型是assignd,Hibernate將不會給其設置ID值。
Flush()方法將內存中的持久化對象同步到數據庫。存儲對象時,Session不會立即將其寫入數據庫;相反,session將大量數據庫寫操作加入隊列,以最大限度的提高性能。
User user=new User(“Andy”,22);
Session session=sessionFatory.openSession();
session.save(user);
session.flush();
session.close();
保存或更新一個對象
Hibernate提供了一種便利的方法用于在你不清楚實例對應的數據在數據庫中的狀態時保存或更新一個對象,也就是說,你不能確定具體是要保存save還是更新update,只能確定需要把對象同步到數據庫中。這個方法就是saveOrUpdate。
Hibernate在持久化時會查看實例的id屬性,如果其為null則判斷此對象是臨時的,在數據庫中找不到對應的實例,其后選擇保存這個對象;而不為空時則意味著對象已經持久化,應該在數據庫中更新該對象,而不是將其插入。
User user=。。。;
Session session=sessionFatory.openSession();
session.saveOrUpdate(user);
Session.flush();
session.close();
刪除一個對象
從數據庫刪除一個對象使用session的delete方法,執行刪除操作后,對象實例依然存在,但數據庫中對應的記錄已經被刪除。
User user=。。。;
Session session=sessionFatory.openSession();
session.delete(user);
session.flush();
session.close();
以ID從數據庫中取得一個對象
如果已經知道一個對象的id,需要從數據庫中取得它,可以使用Session的load方法來返回它。代碼如右.
注意此放在id對應的記錄不存在時會拋出一個HibernateException異常,它是一個非檢查性異常。對此的正確處理是捕獲這個異常并返回一個null。
使用此想法如果采用默認的懶惰加載會導致異常,對此最簡單的解決方案是把默認的懶惰加載屬性修改為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>
檢索一批對象
檢索一批對象需要使用HQL,session接口允許你創建Query對象以檢索持久化對象,HQL是面向對象的,你需要針對類和屬性來書寫你的HQL而不是表和字段名。
從數據庫中查詢所有用戶對象如下:
Query query=session.createQuery(“from User”);// 注意這里User是類名,from前沒有select。
List<User> users=(List<User>)query.list();
從數據庫中查詢名為“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();