Hibernate的接口類型
在了解了Hibernate的基本配置,映射文件后,道路已經鋪平了。我們繼續往前走。接下來,我們應該做的是了解Hibernate常用的接口,對Hibernate的工作方式進一步熟悉,為我們下一步的編碼做好充分的准備。
ORM是復雜的,可以看看Hibernate發布里的javadoc,100+MB。如果我們單單去閱讀它的API,估計一年你才能看完。然而,我們僅僅是使用他,並不需要對它了解的十分完全。我們只需要了解它的常用核心類和接口就行了。就像數據庫是非常復雜的,然而我們僅僅是使用它,又不需要關心它的底層實現,建表還是很easy的。
同樣Hibernate在設計的時候,也考慮到廣大使用者,因此它的API接口設計還是相對簡單的。Hibernate的接口大致可以分為以下幾種類型:
基本操作類:用來完成對數據庫增、刪、改、查的接口。例如:Session、Transaction和Query;
配置類:Hibernate用例讀取配置文件和映射文件的接口。例如:SessionFactory、Configuration;
回調接口:它允許應用程序能對一些事件的發生作出相應的操作。例如:Interceptor、Validatable;
擴展映射機制接口:UserType、CompositeUserType、IdentifierGenerator
Hibernate六個常用接口
Hibernate的類非常多,但我們常用的也就六個,分別是:
Configuration、SessionFactory、Session、Transaction、Query、Criteria。這六個核心接口是我們必須了解和掌握的。通過這六個接口,我們可以完成對數據的基本操作,包括增、刪、改、查,還有事務控制。
這六個接口之間的產生關系如下:
Configuration類
org.hibernate.cfg.Configuration接口的作用是對Hibernate進行配置,以及對它進行啟動。在Hibernate的啟動過程中,Configuration類的實例首先讀取Hibernate配置文件,加載配置信息,然后加載映射文件,創建一個SessionFactory對象。
實例被設計成啟動期間(startup-time)對象,一旦SessionFactory 創建完成它就被丟棄了。
要使用一個Configuration對象,要為它設置兩個方面的內容:
- 數據庫連接屬性
- hbm.xml或pojo類
Configuration常用操作函數
1.加載Hibernate配置文件
Configuration cfg=new Configuration().configure("/etc/hibernate.cfg.xml");
或者
Configuration cfg=new Configuration().configure("/etc/hibernate.properties");
2.為Configuration指定映射文件
cfg.addResource("test/User.hbm.xml");
3.為Configuration指定POJO類,Order.hbm.xml根Order.java一個目錄
cfg.addClass(test.Order.class);
4.為Configuration指定Hibernate配置屬性,當然我們加載了配置文件就不能使用這個方法了。
Configuration cfg = new Configuration()
.addClass(test.User.class)
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
.setProperty("hibernate.order_updates", "true");
5.獲得SessionFactory
SessionFactory sessions = cfg.buildSessionFactory();
當所有映射定義被 Configuration 解析后,應用程序必須獲得一個用於構造org.hibernate.Session 實例的工廠SessionFactory。這個工廠將被應用程序的所有線程共享,線程安全的全局對象,只需要被實例化一次。單例模式。
Hibernate 允許你的應用程序創建多個SessionFactory 實例。這對使用多個數據庫的應用來說很有用。
SessionFactory接口
Hibernate 的SessionFactory是一個關聯於特定數據庫全局的工廠(factory)。如果你要使用多個數據庫,就要用多個的SessionFactory,通常把它們放在多個配置文件(Hibernate.cfg.xml)中(為了更容易啟動)。
SessionFactory不是輕量級的對象,它包含與指定數據連接各種配置信息,是個線程安全的全局對象,只需要被實例化一次。我們不應該在應用程序中多次實例化它。
Session接口
Session接口是我們最常用的一個接口。但Session是一個輕量級的類,創建和銷毀它並不會占用很多資源。請注意,Session對象是非線程安全的,因此在你的設計中,最好一個線程只創建一個Session對象。
Session主要用來管理對數據庫進行的操作,包括開啟一個事務、存取對象、執行查詢。一般可以將Session看成一個對象的緩沖區或持久層管理器,當持久對象被Session管理后,Hibernate在事務提交時能夠自動檢測緩沖區的持久化對象是否已經改變,也就是說持久化對象所攜帶的信息是否發生了改變(臟數據檢查),然后與數據庫進行同步操作。
對象的三種狀態,其實這里指對象與Session關系的三種狀態:
Transient(自由狀態):不曾進行持久化,數據庫中沒記錄,也就是說沒有與Session發生過關聯。
Persistent(持久狀態):持久的實例在數據庫中有對應的記錄,並且在Session的緩存中。
Detached(游離狀態):持久的實例在數據庫中有對應的記錄,但不在Session的緩存中。也就是說曾經與Session發生過關聯。
三種狀態的轉化:
這讓我想到了一個恰當的比喻:對象和Session的關系就像我們與大學的關系:
自由狀態是我們沒上大學;
持久狀態是我們已經被錄取,並且在就讀;
游離狀態是我們已經畢業了,飛走了,但你依然是你母校的學生!
當然,你可以選擇再次深造!
Transaction接口
這個API是可選的,我們可以選擇使用該類來添加事務支持。它是對實際事務實現的一個抽象,這些實現包括JDBC事務、JTA中的UserTransaction、甚至是CORBA事務。之所以這樣設計,是為了開發者能夠使用一個統一的事務操作界面,是的自己的項目可以在不同的環境和容器之間方便的移植。
一個典型的事務應該使用下面的形式,beginTransaction()到commit()之間的代碼處在同一個事務:
beginTransaction()開啟事務;
commit()提交事務;
rollback()在發生異常時回滾事務。
下面的session使用sessionFactory.openSession()方式取的:
Transaction tx = null; try { tx = session.beginTransaction(); // do some work tx.commit(); } catch (RuntimeException e) { if (tx != null) tx.rollback(); throw e; // or display error message } finally { session.close(); }
下面的session使用sessionFactory.getCurrentSession()方式取的:
Transaction tx = null; try { tx = session.beginTransaction(); // do some work tx.commit(); } catch (RuntimeException e) { tx.rollback(); throw e; // or display error message }
Query和Criteria接口
這兩個接口負責執行各種查詢,它可以使用HQL和SQL語句兩種表達方式。由Session創建並執行。
Criteria接口與Query接口非常類似,它允許創建並執行面向對象的標准化查詢。
數據庫操作中查詢是使用最頻繁的,是非常重要的一塊,我們在以后詳細討論。