顯示具有 Hibernate 標籤的文章。 顯示所有文章
顯示具有 Hibernate 標籤的文章。 顯示所有文章

2015年8月2日 星期日

Spring的注解(Annotation)事務(Transaction)範例與JUnit測試(Spring+Hibernate+JUnit)

此篇文以一個簡單完整的範例,來說明在Spring中如何使用注解(Annotation)事務(Transaction)與其要注意的事項,並且以JUnit來測試

首先我們要下載 aopalliance.jar ,不然在執行事務時可能會發生ClassNotFoundException。可以到The Central Repository中搜尋最新版的jar,這是因為aopalliance.jar已經從NetBeans內建的Spring中分離了出來,要自已手動下載並引入至Library。如下圖:

在這裡,我們想要設計的構想其專案配置如下:
詳述如下:

  1. DaoClass.java:操控資料庫的CRUD(新增、查詢、修改、刪除)之Class。
  2. Guest.java:代表資料庫中的資料表之ORM(Object-Relational Mapping) 物件。
  3. ServiceClass.java:使用DaoClass進行事務(Transaction)處理的Class。
  4. DaoTest.java:用來測試DaoClass的測試JUnit。
  5. ServiceTest:用來測試ServiceClass的測試JUnit。
在這裡,Guest代表的Table設計如下圖所示(在此例中Table中不用儲任何紀錄,這裡只是做個示範):


首先是在applicationContext.xml中配置要給Spring托管的內容,如連線池、SessionFactory、Annotation的支持設定、自動裝配Bean等等:

2015年7月9日 星期四

整合Spring、Hibernate和C3P0的配置

當我們只有使用Hibernate的時候,其中要獲取SessionFactory的話必須要使用Hibernate的API手動獲取,例如像這樣:

SessionFactory sessionFactory = AnnotationConfiguration().configure().buildSessionFactory();

如果配合Spring的話,就可以使用注入的概念將SessionFactory注入到要使用SessionFactory的類別中。

整合Spring與Hibernate有兩種方法:

  1. 在Spring配置中直接將原Hibernate的配置檔抓進來。
  2. 在Spring自己配置Hibernate的配置、連接池(例如C3P0)等,可以捨棄原來的Hibernate配置檔,也可把它抓進來,然後覆蓋部份配置。

讓我們再一次看一次原來的Hibernate配置檔,hibernate.cfg.xml:

2015年7月8日 星期三

Hibernate中C3P0連接池的設置

在一開始使用Hibernate做ORM(Object/Relational Mapping)時,如果我們沒有配置連接池(Connection Pool),可能會發生一些底層連接Database會碰到的問題,例如sessionFactory所產生的連接太久沒有動作而被Database端以Timeout為由強行關閉,而之後在使用連接時就會出錯(在Hibernate端似乎無法用SessionFactory的isClosed()來判斷),此時就可能要自己在做CRUD(Create,Read,Update,Delete)時手動測試連接是否還在等等。

如果配置了連接池,就可以簡單地受益於連接池帶來的許多好處,例如幫我們管理連線,最小連接數量、最大連接數量、定時檢測連線等等。

在Hibernate裡已經包含了一個很好用且有名的開源數據庫連接池,C3P0,如果你在NetBeans裡使用了Hibernate框架,那麼你就可以在Library中看到C3P0的jar,如下圖紅框內所示:

對於C3P0,以下的連結提供了不錯的介紹、範例與相闗資料:

  1. C3P0百度百科
  2. How to configure the C3P0 connection pool in Hibernate
  3. 關於MySQL的wait_timeout連接超時問題報錯解決方案
  4. c3p0 - JDBC3 Connection and Statement Pooling(官方網站)
在這邊,我把我使用的例子在這邊做了一個紀錄,在Hibernate的配置文件hibernate.cfg.xml中,加入如以下配置,這樣Hibernate就會自動偵測並使用C3P0了:
        <!--==============C3P0的配置=============-->
        <!-- 最小連接數 -->
        <property name="hibernate.c3p0.min_size">5</property>
        <!-- 最大連接數 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 多久會把無用的連接視為timeout並移除到min_size的連接數量,單位毫秒 -->
        <property name="hibernate.c3p0.timeout">300</property>
        <!-- 最大的PreparedStatement的數量 -->
        <property name="hibernate.c3p0.max_statements">50</property>
        <!-- 多久進行空閒連接的檢查,確定連接還存在,例如有無被Database端關掉,單位是秒-->
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <!--======================================-->

注意:此處例出來的配置只是C3P0配置的一部份,其功能不只這些,其他的配置可以在上述的資料連接中查到。

2015年6月30日 星期二

簡易Hibernate入門(NetBeans+Servlet+MySQL)

Hibernate是一個基於資料庫物件化的一個框架(framework),它將資料庫裡的表格(Table)中的每一行紀錄實做成一個Java Bean型式的類別,而其中的屬性對應到了紀錄中的每欄位(Column),且擁有各自的Getter與Setter方法。

利用Hibernate我們可以以物件化的方式操控Database及以物件的方式得到查詢結果。在這裡我們要實作一個簡單的使用了Hibernate的Servlet,利用NetBeans的功能,可以使我們容易地實作Hibernate的許多細節。

一、在這邊我們使用MySQL作為我們的資料庫。首先先在MySQL中建立一個名為guest_database的資料庫,其中建立一個名為guest_list的Table,有三個欄位,分別是id、name、age、birth_date,tyep分別是varchar、varchar、int、date。我們先加入幾條紀錄,如下圖所示: