整合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对注解标注的类进行映射的加载。