雨步 订阅
相关博文
内容读取中…
推荐博文
内容读取中…
谁看过这篇博文
内容读取中…
字体大小: 正文
《spring2.0宝典》8整合Hibernate执行持久化操作 (2008-02-28 08:33:27)
ORM介紹
ORM的全稱是Object/Relation Mapping,即對象/關係映射。牠並不是一種具體的產品,而是一類框架的總稱,牠概述了這類框架的基本特征:完成面向對象的程序設計語言到關係數據庫的映射。隨着面向對象數據庫的出現,ORM工具會自動消亡。
A.爲什麽需要ORM
面向對象的程序設計語言,代表目前程序設計的主流各爭執,但數據庫的發展並未與程序設計語言同步。關係數據庫的某些優勢,也是面向對象的語言目前無法解決的。如:大量數據操作查找、排序;數據庫的約束、隔離等等(我曾經使用oracle的blob二制進流存放一個JavaBean實例,對關於這個存放對象的字段排序是不可以的)

Hibernate介紹
它是目前最流行的ORM框架,採用很優雅的方式,將SQL操作包裝成對象化的操作。
A.採用傳統的JDBC操作數據庫
Class.forName(driver);
Connection conn=DriverManager.getConnection(url);
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,id);
pstmt.executeUpdate();
B.Hibernate初探
首先了解一個概念:PO(Persistent Object)持久化對象。
1.編寫一個POJO類
public class News{…}
2.創建映射文件
……
3.面向對象的操作
News news=session.load(news.class,new Integer(id));
Category c=news.getCategory();//面向對象的加載相關類,不用SQL語句,甚至HQL(Hibernate Query Language,牠完全可以理解如繼承、多態和關聯等面向對象的概念)等等
更多的關係Hibernate的技術請看相關書籍,在此我衹介紹在其他書籍沒有介紹的一些知識:
select語句可以返回多個對象或屬性,直接存放在List對象中
select new List(p,s)from Person as p join p.son as s;
或放到一個JavaBean對象:
select new Family(p,s)from Person as p join p.son as s;前提是要有Family(Person p,Son s)構造函數

整合Hibernate
A.Spring管理Hibernate持久層有如下優勢
1.通用的資源管理:Hibernate的配置文件融合於Spring的配置文件中
2.有效的Session管理
3.方便的事務管理
4.異常包裝
我認爲:因爲有以上幾個優勢,使得使用Spring支持的Hibernate DAO時,很多衹要一條語句就可以了。
B.管理SessionFactory
Spring通過ApplicationContext管理SessionFactory,無須採用單獨Hibernate應用必需的hibernate.cfg.xml文件


………




PO映射文件……


org.hibernate………


JNDI數據源

java:comp/env/…

B.Spring對Hibernate的簡化
Hibernate的持久層訪問按如下步驟:
Configuration configuration=new Configuration().configure();
SessionFactory sessionFactory=configuration.buildSessionFactory();
session=sessionFactory.openSession();
Transaction tx=session.beginTransaction();
訪問數據庫代碼
tx.commit();
session.close();
Spring對Hibernate的簡化主要有如下幾個方面(在前面也提過):
1.基於依賴注入的SessionFactory管理機制
2.更優秀的Session管理機制,無須在代碼中操作Session
3.統一的事務管理,無須煩瑣的開始、提交、囬滾事務
4.統一的異常處理機制。不再強制開發者在持久層捕捉異常
5.提供HibernateTemplate支持類,簡化代碼編寫
C.使用HibernateTemplate
1.ApplicationContext ctx=new FileSystemXmlApplicationContext(“bean.xml”);
SessionFactory sessionFactory=(SessionFactory)ctx.getBean(“sessionFactory”);
利用sessionFactory注入到HibernateTemplate的構造方法中,然後由它訪問數據庫
2.利用依賴注入把sessionFactory注入到DAO實現類



在PersonDaoImpl中提供setSessionFactory(SessionFactory sessionFactory)方法,然後
new HibernateTemplate(this.sessionFactory);執行訪問數據庫
D.Hibernate的複雜用法HibernateCallback
通過HiberanteCallback程序開發可以完全使用Hiberante的操作方式,解決了Spring封裝Hibernate後靈活性不足的缺陷(就像Hibernate也提供了原生SQL的數據庫訪問方式),該接口衹有一個方法:doInHibernate(org.hibernate.Session session),通常使用匿名內部類來獲取HibernateCallback實例
hibernateTemplate.execute(new HibernateCallback(){
public Object doInHibernate(Session session)throws HibernateException{
return session……;
}
});
D.Hibernate的DAO實現(這裡最方便的方式)
主要有如下兩種方式的DAO實現
繼承HibernateDaoSupport的實現DAO
基於Hibernate3.0實現DAO
1.繼承HibernateDaoSupport實現DAO
Spring爲Hibernate的DAO提供工具類HibernateDaoSupport,牠有兩個方法:
public final HibernateTemplate getHibernateTemplate();
public final void setSessionFactory(SessionFactory sessionFactory);
這樣編寫DAO的實現類時,DAOImpl實現DAO又繼承HibernateDaoSupport,使用依賴注入SessionFactory,就要以直接使用getHibernateTemplate()來訪問數據庫,如:



public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO{
public List getPersons(){
return getHibernateTemplate().find(“from Person”);
}
}
2.基於Hiberante3.0實現DAO
Hibernate3.0.1提供一種新的技術”contextual Session”,通過此機制,保證每次事務一個Session,類似於Spring的每次事務一次Hibernate Session的同步策略。實現方式:在DAOImpl中注入SessionFactory,通過SessionFactory的getCurrentSesson方法



public class PersonDAOImpl implements PersonDAO{
public List getPersons(){
this.sessionFactory.getCurrentSession().createQuery(“from Person”).list();
}
public void setSessonFactory(SessionFactory sessionFactory){
…….
}
}
D.聲明式事務管理
有三種方式:
1.使用TransactonProxyFactoryBean爲目標bean生成事務代理的配置,此方式是最傳統、最臃腫、難以閱讀的方式
2.採用bean的繼承的事務代理配置方式
3.使用BeanNameAutoProxyCreator,根據名字自動生成事務代理。建議採用的方式。

//事務管理器


//事務攔截器


PROPAGATION_REQUIRED……



//業務代理

//可以列出更多要生成事務代理的bean



transactionInterceptor//可以增加其他攔截器


评论(0)| 阅读 (0) | 收藏 (0) | 分享 | 打印 | 举报
评论 发表评论
发表评论
匿名评论(无需注册)
验证码:看不清楚数字吗?点击这里再试试。
新浪BLOG意见反馈留言板 不良信息反馈 电话:95105670 提示音后按2键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有