温故知新: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 都较瘦 阅读(100) 评论(0)  编辑  收藏 所属分类: containerFramework


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

公告

博客定位:囿于目前的水平,博客定位在记录自己的学习心得和随手的练习

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜