Hibernate常用接口


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。這六個核心接口是我們必須了解和掌握的。通過這六個接口,我們可以完成對數據的基本操作,包括增、刪、改、查,還有事務控制。

這六個接口之間的產生關系如下:

clip_image001

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發生過關聯。

三種狀態的轉化:

clip_image002

這讓我想到了一個恰當的比喻:對象和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接口非常類似,它允許創建並執行面向對象的標准化查詢。

數據庫操作中查詢是使用最頻繁的,是非常重要的一塊,我們在以后詳細討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM