Spring整合hibernate(2)之基于HibernateTemplate的整合
Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础;
在文章Spring整合hibernate(1)之基础整合 的基础上完成!
使用hibernate的基础整合基于SessionFactory,已经很方便了,下面我们用基于HibernateTemplate的方式整合。
1.在BaseDao中直接用HibernateTemplate 创建对象,创建HibernateTemplate注入的sessionFactory的Bean并注入。
<span style="font-family:FangSong_GB2312;font-size:14px;"><!-- 开启HibernateTemplate,并且为其注入sessionFactory,
使用HibernateTemplate不太方便的就是要获取session得通过getSessionFactory() -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean></span>
<span style="font-family:FangSong_GB2312;font-size:14px;">public class BaseDao {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}</span>
2.在我们的Dao中,HibernateTemplate也为我们提供了类似的方法。
<span style="font-family:FangSong_GB2312;font-size:14px;">@Override
public void add(Group group) {
this.getHibernateTemplate().save(group);
}</span>
3.基于查询的方法HibernateTemplate提供的find等方法使用不是很方便。下面是用HibernateTemplate获取Session并创建查询。
<span style="font-family:FangSong_GB2312;font-size:14px;">Query query=this.getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(sql);
</span>
具体实现代码:
XML
<span style="font-family:FangSong_GB2312;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 打开Spring的Annotation的支持 -->
<context:annotation-config />
<!-- 设定Spring去哪些包中找Annotation -->
<context:component-scan base-package="org.oms.spring" />
<!-- 创建数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置连接池的初始值 -->
<property name="maxActive" value="500" />
<!-- 最大空闲时,当经过一个高峰之后,连接池可以将一些用布到的连接释放,一直减少到maxIdle为止 -->
<property name="maxIdle" value="20" />
<!-- 当最小空闲时,当连接少于minIdle时会自动申请一些连接 -->
<property name="minIdle" value="1" />
<property name="maxWait" value="1000" />
</bean>
<!-- 导入src下的jdbc.properties -->
<context:property-placeholder location="jdbc.properties" />
<!-- 创建sessionFactory工厂 -->
<!-- 如果使用的是Annotation方式不能使用org.springframework.orm.hibernate3.LocalSessionFactoryBean,而应该使用org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 设置Spring去那个包中查找相应的实体类 -->
<property name="packagesToScan">
<value>org.oms.spring.model</value>
</property>
<property name="hibernateProperties">
<!-- <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true
hibernate.hbm2ddl.auto=update hibernate.format_sql=false </value> -->
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean>
<!-- 开启HibernateTemplate,并且为其注入sessionFactory,
使用HibernateTemplate不太方便的就是要获取session得通过getSessionFactory() -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置Spring的事物处理 -->
<!-- 创建事物管理器 -->
<!-- SessionFactory, DataSource, etc. omitted -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置AOP,Spring是通过AOP来进行事物管理的 -->
<aop:config>
<!-- 设置pointcut表示哪些方法要加入事物处理 -->
<aop:pointcut id="allMethods"
expression="execution(* org.oms.spring.dao.*.*(..))" />
<!-- 通过advisor来确定具体要加入事物控制的方法 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>
<!-- 配置哪些方法要加入事物控制 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 让所有方法都加入事物管理(效率低,实际使用中按需处理) -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
</beans>
</span>
BaseDao类
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao;
import javax.annotation.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
public class BaseDao {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
</span>
具体实现dao类
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao;
import org.oms.spring.model.Group;
import org.springframework.stereotype.Repository;
/**
* Group基于Hibernate的CRUD
* @author sunlight
*
*/
@Repository("groupHibernateDao")
public class GroupHibernateDao extends BaseDao implements IGroupDao {
@Override
public void add(Group group) {
//getSession是通过getCurrentSession来获取Session,它会被Spring所管理,所以不用进行其他操作
this.getHibernateTemplate().save(group);
}
@Override
public Group load(int id) {
//load() 方法报错,延时加载问题,后面会讲到,此处使用get方法
return this.getHibernateTemplate().load(Group.class, id);
}
}
</span>
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.oms.spring.model.Group;
import org.oms.spring.model.User;
import org.springframework.stereotype.Repository;
/**
* User基于Hibernate的CRUD
* @author sunlight
*
*/
@Repository("userHibernateDao")
public class UserHibernateDao extends BaseDao implements IUserDao {
private IGroupDao groupHibernateDao;
public IGroupDao getGroupHibernateDao() {
return groupHibernateDao;
}
@Resource
public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
this.groupHibernateDao = groupHibernateDao;
}
@Override
public void add(User user, int gid) {
Group group=groupHibernateDao.load(gid);
user.setGroup(group);
getHibernateTemplate().save(user);
}
@Override
public void update(User user, int gid) {
Group group=groupHibernateDao.load(gid);
user.setGroup(group);
getHibernateTemplate().update(user);
}
@Override
public void delete(int id) {
User user=this.load(id);
getHibernateTemplate().delete(user);
}
@Override
public User load(int id) {
return getHibernateTemplate().load(User.class, id);
}
@SuppressWarnings("unchecked")
@Override
public List<User> list(String sql, Object[] args) {
//此处基于HQL的查询,好瞌睡!
Query query=this.getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(sql);
if(query!=null){
for (int i = 0; i < args.length; i++) {
query.setParameter(i, args[i]);
}
}
return query.list();
}
}
</span>
其他内容无需修改即可完成HibernateTemplate的整合!