<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    溫故知新: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 

    還有兩種方式,但是個人感覺比較冗余,提供了過多的接口去提供類似的功能有時候有點讓人無所適從。可以使用spring提供的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 都較瘦 閱讀(102) 評論(0)  編輯  收藏 所屬分類: containerFramework

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    公告

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

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品无码成人AAA片| 亚洲美女在线观看播放| 亚洲视频在线观看免费| 国产精品亚洲午夜一区二区三区 | 在线免费一区二区| 无遮挡免费一区二区三区| 亚洲成人免费在线| 日韩高清免费在线观看| 在线看片免费人成视频播| 涩涩色中文综合亚洲| 亚洲乳大丰满中文字幕| 亚洲精品在线免费看| 亚洲av最新在线观看网址| 国产AV无码专区亚洲AVJULIA | 黄 色一级 成 人网站免费| 亚洲欧洲日产国码www| 国产男女猛烈无遮挡免费视频 | 久久国产精品免费看| 亚洲精品又粗又大又爽A片| 亚洲gv猛男gv无码男同短文| 天天摸天天碰成人免费视频| 欧洲人免费视频网站在线| 噜噜噜亚洲色成人网站| 亚洲国产成人久久精品app| 亚洲中文字幕无码一久久区| 蜜桃视频在线观看免费网址入口| 四虎国产精品免费永久在线| 无码亚洲成a人在线观看| 在线观看亚洲一区二区| 亚洲日本va在线视频观看| 免费理论片51人人看电影| 日本h在线精品免费观看| 99免费精品视频| 人妻无码中文字幕免费视频蜜桃| 亚洲乱码在线播放| 亚洲第一中文字幕| 亚洲精品亚洲人成人网| 亚洲伊人久久综合中文成人网| 国产精品免费看久久久无码| 99在线精品视频观看免费| 6080午夜一级毛片免费看 |