基於Hibernate編寫DAO

上一篇介紹瞭如何在ssh環境中配置Hibernate框架,本篇介紹如何基於Hibernate框架編寫DAO


1. Hibernate框架相關接口




Hibernate體系結構如圖所示,下面介紹Hibernate體系結構中常用的類


SessionFactory

配置對象被用於創造一個 SessionFactory 對象,使用提供的配置文件爲應用程序依次配置 Hibernate,並允許實例化一個會話對象。SessionFactory 是一個線程安全對象並由應用程序所有的線程所使用。

SessionFactory 是一個重量級對象所以通常它都是在應用程序啓動時創造然後留存爲以後使用。每個數據庫需要一個 SessionFactory 對象使用一個單獨的配置文件。所以如果你使用多種數據庫那麼你要創造多種 SessionFactory 對象。



Session 

一個會話被用於與數據庫的物理連接。Session 對象是輕量級的,並被設計爲每次實例化都需要與數據庫的交互。持久對象通過 Session 對象保存和檢索。

Session 對象不應該長時間保持開啓狀態因爲它們通常情況下並非線程安全,並且它們應該按照所需創造和銷燬。



Transaction 

一個事務代表了與數據庫工作的一個單元並且大部分 RDBMS 支持事務功能。在 Hibernate 中事務由底層事務管理器和事務(來自 JDBC 或者 JTA)處理。

這是一個選擇性對象,Hibernate 應用程序可能不選擇使用這個接口,而是在自己應用程序代碼中管理事務。


Query 對象

Query 對象使用 SQL 或者 Hibernate 查詢語言(HQL)字符串在數據庫中來檢索數據並創造對象。一個查詢的實例被用於連結查詢參數,限制由查詢返回的結果數量,並最終執行查詢。



2. 基於Hibernate實現DAO

spring-hibernate3.jar中提供了HibernateDaoSupport抽象類,用於編寫基於Hibernate的DAO實現,該類提供了豐富的方法,便於對數據庫進行增刪該查,繼承Hibernate類後,需要定義setHibernateSessionFactory方法,使spring可以將容器中的sessionFactory組件注入給DAO。使用getSession可以獲得相應的Sesssion對象

package com.bs_circle.dao;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.bs_circle.entity.User;

@Repository
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
	
	//通過該方法注入sessionFactory對象
	@Resource(name = "sessionFactory") 
	public void setHibernateSessionFactory(SessionFactory sessionFactory) {  
	    super.setSessionFactory(sessionFactory);  
	}
	
	public void save(User user) {
		getHibernateTemplate().save(user);
	}

	public User findById(String id) {
		return (User)getHibernateTemplate().get(User.class, id);
	}

	public void update(User user) {
		getHibernateTemplate().update(user);
	}

	public User findByName(String name) {
		Session session = getSession();
		Query query =  session.createQuery(FIND_BY_NAME_HQL);
		query.setString(0, name);
		User u = (User) query.uniqueResult();
		return u;
	}
}

注意由於Session代表與數據庫的鏈接,因此開啓後需要手動關閉,但是因爲Hibernate的延時加載特性,如果在加載前提前關閉Session會在真正需要查詢時拋出異常。方便的做法是採用事物進行統一管理@Transactional,spring在提交事物後會自動關閉數據庫鏈接。更多解決方案參考http://blog.sina.com.cn/s/blog_864f40cb01017oef.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章