溫故知新:spring_09整合Hibernate

          整合Hibernate和JDBC有些類似的地方,spring依舊是處理了hibernate的公共打開關閉session等操作,但是詳盡內容還是需要參閱文檔http://docs.spring.io/spring-framework/docs/,這里先記載一個和Hibernate3整合的常用案例。spring整合hibernate3和hibernate4,這兩個版本有一些差異。

          首先,整合spring和hibernate3要導入一系列依賴,譬如log4j,DBCP,hibernate等
           1         <dependency>
           2             <groupId>org.slf4j</groupId>
           3             <artifactId>slf4j-api</artifactId>
           4             <version>1.6.1</version>
           5         </dependency>
           6 
           7         <dependency>
           8             <groupId>org.hibernate</groupId>
           9             <artifactId>hibernate-core</artifactId>
          10             <version>3.3.2.GA</version>
          11         </dependency>
          12 
          13         <dependency>
          14             <groupId>org.hibernate</groupId>
          15             <artifactId>hibernate-entitymanager</artifactId>
          16             <version>3.4.0.GA</version>
          17         </dependency>
          18 
          19         <dependency>
          20             <groupId>org.springframework</groupId>
          21             <artifactId>spring-core</artifactId>
          22             <version>3.0.5.RELEASE</version>
          23         </dependency>
          24 
          25         <dependency>
          26             <groupId>org.springframework</groupId>
          27             <artifactId>spring-context</artifactId>
          28             <version>3.0.5.RELEASE</version>
          29         </dependency>
          30 
          31         <!-- spring測試相關包 -->
          32         <dependency>
          33             <groupId>org.springframework</groupId>
          34             <artifactId>spring-test</artifactId>
          35             <version>3.0.5.RELEASE</version>
          36         </dependency>
          37 
          38         <dependency>
          39             <groupId>javax.annotation</groupId>
          40             <artifactId>javax.annotation-api</artifactId>
          41             <version>1.2</version>
          42         </dependency>
          43 
          44         <dependency>
          45             <groupId>org.springframework</groupId>
          46             <artifactId>spring-aop</artifactId>
          47             <version>3.0.5.RELEASE</version>
          48         </dependency>
          49 
          50         <dependency>
          51             <groupId>org.springframework</groupId>
          52             <artifactId>spring-orm</artifactId>
          53             <version>3.0.5.RELEASE</version>
          54         </dependency>
          55 
          56 
          57         <dependency>
          58             <groupId>org.aspectj</groupId>
          59             <artifactId>aspectjweaver</artifactId>
          60             <version>1.5.4</version>
          61         </dependency>
          62 
          63         <!-- Mysql驅動依賴 -->
          64         <dependency>
          65             <groupId>mysql</groupId>
          66             <artifactId>mysql-connector-java</artifactId>
          67             <version>5.1.6</version>
          68         </dependency>
          69 
          70         <!-- 數據庫連接池 -->
          71         <dependency>
          72             <groupId>commons-dbcp</groupId>
          73             <artifactId>commons-dbcp</artifactId>
          74             <version>1.3</version>
          75         </dependency>
          76 
          77         <!-- log4j -->
          78         <dependency>
          79             <groupId>log4j</groupId>
          80             <artifactId>log4j</artifactId>
          81             <version>1.2.16</version>
          82         </dependency>
          依賴添加完畢后,配置beans.xml
           1 <?xml version="1.0" encoding="UTF-8"?>
           2 <beans xmlns="http://www.springframework.org/schema/beans"
           3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
           4     xmlns:aop="http://www.springframework.org/schema/aop"
           5     xmlns:tx="http://www.springframework.org/schema/tx"
           6     xsi:schemaLocation="http://www.springframework.org/schema/beans 
           7                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           8                         http://www.springframework.org/schema/context
           9                         http://www.springframework.org/schema/context/spring-context-3.0.xsd
          10                         http://www.springframework.org/schema/aop
          11                         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
          12                         http://www.springframework.org/schema/tx
          13                         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
          14 
          15     <!-- 開啟注解 -->
          16     <context:annotation-config />
          17     <context:component-scan base-package="org.duyt" />
          18 
          19     <!-- 使用DBCP數據源 -->
          20     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          21         destroy-method="close">
          22         <property name="driverClassName" value="${jdbc.driverClassName}" />
          23         <property name="url" value="${jdbc.url}" />
          24         <property name="username" value="${jdbc.username}" />
          25         <property name="password" value="${jdbc.password}" />
          26     </bean>
          27 
          28     <context:property-placeholder location="jdbc.properties" />
          29 
          30     <!-- 使用hibernateTemplate -->
          31     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
          32         <property name="sessionFactory" ref="sessionFactory"/>
          33     </bean>
          34     
          35     <!-- 
          36         配置sessionFactory
          37         這里的class還可以選用localSessionFactoryBean,是使用xml配置文件進行類的加載 
          38         對mappingResource屬性進行諸如
          39         <list>
          40             <value>XXX.hbm.xml</value>
          41         </list>
          42     -->
          43     <bean id="sessionFactory" 
          44         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
          45         <property name="dataSource" ref="dataSource" />
          46         <property name="packagesToScan">
          47             <value>org.duyt.domain</value>
          48         </property> 
          49         <property name="hibernateProperties">
          50             <props>
          51                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
          52                 <prop key="show_sql">true</prop>
          53                 <prop key="hibernate.hbm2ddl.auto">update</prop>
          54             </props>
          55         </property>
          56     </bean>
          57 
          58     <!-- 
          59         調試過程中可能會出現如下異常,在此需要開啟spring的事務管理
          60         org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
          61         at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
          62         at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:622)
          63         ...
          64      -->
          65     <!-- 事物管理 -->
          66     <bean id="transactionManager"
          67         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          68         <property name="sessionFactory" ref="sessionFactory" />
          69     </bean>
          70 
          71     <!-- 切面定義 -->
          72     <aop:config>
          73         <aop:pointcut id="methods"
          74             expression="execution(* org.duyt.dao.*.*(..))" />
          75         <aop:advisor advice-ref="txAdvice" pointcut-ref="methods" />
          76     </aop:config>
          77 
          78     <!-- 通知 -->
          79     <tx:advice id="txAdvice" transaction-manager="transactionManager">
          80         <tx:attributes>
          81             <!-- 為了演示,所有方法都添加事務管理 -->
          82             <tx:method name="*" propagation="REQUIRED"/>
          83         </tx:attributes>
          84     </tx:advice>
          85 
          86 
          87 </beans>
          如此一來,配置工作就完畢了,spring整合hibernate3,提供了多種對數據進行操作的接口
          第一種我們可以使用hibernate提供的session,在BaseDao中注入sessionFactory,向子類DAO暴露提供獲取session的方法,子類DAO利用hibernate原生session進行操作
          BaseDao
           1 package org.duyt.dao.impl;
           2 
           3 import javax.annotation.Resource;
           4 
           5 import org.hibernate.Session;
           6 import org.hibernate.SessionFactory;
           7 
           8 public class BaseDao {
           9     
          10     private SessionFactory sessionFactory;
          11 
          12     public SessionFactory getSessionFactory() {
          13         return sessionFactory;
          14     }
          15 
          16     @Resource
          17     public void setSessionFactory(SessionFactory sessionFactory) {
          18         this.sessionFactory = sessionFactory;
          19     }
          20     
          21     /**
          22      * 整合的時候不需要使用sessionFacroty的openSession方法,使用getCurrentSession方法獲取session
          23      * @return
          24      */
          25     protected Session getSession(){
          26         return sessionFactory.getCurrentSession();
          27     }
          28     
          29 }
          30 
          UserDao
           1 package org.duyt.dao.impl;
           2 
           3 import java.util.List;
           4 
           5 import org.duyt.dao.IUserDao;
           6 import org.duyt.domain.User;
           7 import org.springframework.stereotype.Repository;
           8 
           9 @Repository("hiberUserDao")
          10 public class UserDao extends BaseDao implements IUserDao{
          11 
          12     public Long add(User user) {
          13         return (Long) getSession().save(user);
          14     }
          15 
          16 }
          17 

          還有兩種方式,但是個人感覺比較冗余,提供了過多的接口去提供類似的功能有時候有點讓人無所適從??梢允褂胹pring提供的HibernateDaoSupport或者HibernateTemplate。要使用HibernateDaoSupport,我們需要讓BaseDao繼承HibernateDaoSupport,并注入sessionFactory,值得一提的是,
          HibernateDaoSupport
          的setSessionFactory方法為final的,不可重寫,需要額外套一層set方法去調用。其實HibernateDaoSupport的setSessionFactory方法在內部是創建了hibernateTemplate,和直接使用hibernateTemplate很類似。如此設置完畢之后,子類DAO直接通過getHibernateTemplate取得模板,調用相應的CURD方法即可。
          BaseDao
          1     @Resource(name="sessionFactory")
          2     private void setSuperSessionFactory(SessionFactory sessionFactory){
          3         super.setSessionFactory(sessionFactory);
          4     }
          UserDao
          1     public Long add(User user) {
          2         return (Long) this.getHibernateTemplate().save(user);
          3     }

          再就是在BaseDao直接注入hibernateTemplate,在子類Dao中直接使用
           1     private HibernateTemplate hibernateTemplate;
           2 
           3     public HibernateTemplate getHibernateTemplate() {
           4         return hibernateTemplate;
           5     }
           6 
           7     @Resource
           8     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
           9         this.hibernateTemplate = hibernateTemplate;
          10     }
          UserDao
          1      public Long add(User user) {
          2          return (Long) this.getHibernateTemplate().save(user);
          3      }
          和hibernate3進行整合,對數據庫進行操作需要使用hibernateTemplate,HibernateDAOsupport或者Hibernate原生session,如果使用前兩個類,則需要通過模板方法進行操作,或者獲取session,之后CURD,但是在hibernate4中,取消了這兩個類的,直接通過注入sessionFactory在BaseDao中,通過工廠開啟session進行CURD操作即可。此外,配置文件中的所有類的依賴也需要改為對hibernate4的支持,在4中已經取消了org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,可以直接使用localSessionFactoryBean對注解標注的類進行映射的加載。

          posted on 2014-11-09 00:37 都較瘦 閱讀(106) 評論(0)  編輯  收藏 所屬分類: containerFramework

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          公告

          博客定位:囿于目前的水平,博客定位在記錄自己的學習心得和隨手的練習

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 卢龙县| 黑水县| 都匀市| 朝阳市| 南京市| 宣武区| 成安县| 河曲县| 武城县| 秭归县| 武威市| 岳普湖县| 重庆市| 定日县| 勐海县| 射洪县| 鄂州市| 桓台县| 绥中县| 兴文县| 余姚市| 阿拉尔市| 东莞市| 洪洞县| 佛冈县| 砀山县| 临沧市| 金坛市| 阳朔县| 房产| 黑山县| 钦州市| 襄汾县| 沅陵县| 岐山县| 略阳县| 澎湖县| 图们市| 浦江县| 天长市| 望奎县|