1. 程式人生 > >hibernate學習二 基本用法

hibernate學習二 基本用法

初始化 erro 共享 org HR 如果 oca stat exceptio

一 映射文件User.hbm.xml

定義了持久化類實例是如何存儲和加載的,這個文件定義了持久化類和表的映射。

根據映射文件,Hibernate可以生成足夠的信息以產生所有的SQL語句,也就是類的實例進行插入,更新,刪除和查詢所需要的SQL語句。

二 配置文件hibernate.cfg.xml(另外一種格式是hibernate.properities)

Hibernate配置文件:配置數據庫連接以及Hibernate運行時所需要的各個屬性的值。兩種格式的文件是等價的,同時存在的的話xml的會覆蓋properties的。

xml相比properties的優勢:XML格式的文件更易於修改,配置能力更強;當改變底層應用配置時不需要改變和重新編譯代碼,由hibernate自動加載,而properties就沒有這個優勢。

常見配置屬性:

   (1) Hibernate JDBC屬性

   訪問DB,要獲得JDBC連接,所以需要有JDBC連接屬性: JDBC驅動, URL, 用戶名, 密碼, 連接池個數(pool_size)

(2) hibernate.dialect屬性

   不同SQL數據庫的SQL語言有一定的差異,為了讓hibernate對不同的DB產生合適的SQL,需要指定方言。Hibernate會根據JDBC返回的metadata得到正確的方言。

   (3) hibernate.show_sql

   SQL語句輸出到控制臺,方便調試。

   (4) 映射文件列表

   包含xxx.hbm.xml文件

三: HibernateUtil.java

要啟動hibernate需要創建一個SessionFactory對象。SessionFactory是一個線程安全的對象,只能被實例化一次,可以被多個線程共享。使用SessionFactory可以獲得Session的一個或多個實例。package cn.jbit.auction.dao;import org.hibernate.Session;import org.hibernate.SessionFactory;

Session是持久化操作的基礎,為持久化對象提供CURD操作。

Hibernate在處理session的時候使用延遲加載機制,在真正訪問DB的時,才從連接池中獲取數據庫連接。

Session不是線程安全的,所以這裏使用了Thread Local模式。

import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    // 初始化一個ThreadLocal對象
    private static final ThreadLocal sessionTL = new ThreadLocal(); // Session每個線程有一個session的副本,線程之間不影響。

// configuration 和 SessionFactory都是靜態的,只能實例化一次
private static Configuration configuration; private final static SessionFactory sessionFactory; static { try { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static Session currentSession() { //sessionTL的get()方法根據當前線程返回其對應的線程內部變量, //也就是我們需要的Session,多線程情況下共享數據庫連接是不安全的。 //ThreadLocal保證了每個線程都有自己的Session。 Session session = (Session) sessionTL.get(); // 如果session為null,則打開一個新的session
// 如下的標為紅色的代碼不需要加鎖,不需要雙重判斷,因為session本身是線程局部變量了,不存在多線程的問題。
if (session == null) { //創建一個數據庫連接對象session。 session = sessionFactory.openSession(); // 保存該數據庫連接session到ThreadLocal中。 sessionTL.set(session); } //如果當前線程已經訪問過數據庫了, //則從sessionTL中get()就可以獲取該線程上次獲取過的數據庫連接對象。 return session; } /** * 關閉Session */ public static void closeSession(){ Session session = (Session) sessionTL.get(); sessionTL.set(null); session.close(); } }

四 編寫Dao(Data Access Object)接口

Dao模式是標準的J2EE模式:

(1) 一個Dao接口

(2) 一個實現Dao接口的具體類

(3) 一個Dao工廠類

(4) 數據傳遞對象,主要是POJO

Dao接口定義了所有的CURD操作。Dao實現類實現了接口中定義的方法。

UserDAOImple.java的的一部分代碼如下:

public void  save(User user)
{
       Session session = HibernateUtil.getSession();
       Transaction   tx = session.beginTransaction();
       try {
           session.save(user);
           tx.commit();
      } catch(Exception e) {
           tx.rollback; 
      }
      finally {
            HibernatenateUtil.closeSession();
       }
}

hibernate學習二 基本用法