为什么要整合 Hibernate ?
1 、使用Spring 的IOC 功能管理SessionFactory 对象
LocalSessionFactoryBean
2 、使用Spring 管理Session 对象
HibernateTemplate
3 、使用Spring 的功能实现声明式的事务管理整合 Hibernate 的步骤:
1 、配置SessionFactory (可以自动完成)
<beanid="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>2 、配置 HibernateTemplate ,用于完成数据操作
<bean id="hibernateTemplete" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory"ref="sessionFactory"></property>
</bean>3、让Common继承HibernateDaoSupport类,该类提供了HibernateTemplate的getter和setter方法。
4 、将 hibernateTemplete 注入到 Common 中
<bean id="common" class="com.aptech.common.Common">
<property name="hibernateTemplate"ref="hibernateTemplete"></property>
</bean>5 、将 Common 的方法修改成 hibernateTemplete 的操作。
package com.aptech.common;import java.sql.SQLException;
import java.util.List;import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.aptech.exception.CommonException;
import com.aptech.htm.HibernateSessionFactory;
/**
* 通用类, 不再负责事务处理
* 目标对象
* @author 李赞红
*
* @param <POJO>
*/
public class Common<POJO> extends HibernateDaoSupport implementsICommon<POJO> {
public void insertObject(POJO pojo) throws CommonException {
try {
this.getHibernateTemplate().save(pojo);
} catch (DataAccessException e) {
e.printStackTrace();
throw new CommonException(e);
}
}public void updateObject(POJO pojo) throws CommonException{
try {
this.getHibernateTemplate().update(pojo);
} catch (DataAccessException e) {
e.printStackTrace();
throw new CommonException(e);
}
}public void deleteObject(Class theClass, long id) throwsCommonException {
try {
Object obj = this.getHibernateTemplate().load(theClass, id);
this.getHibernateTemplate().delete(obj);
} catch (DataAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new CommonException(e);
}
}public POJO loadObject(Class theClass, long id) throwsCommonException {
try {
Object obj = this.getHibernateTemplate().load(theClass, id);
return (POJO) obj;
} catch (DataAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new CommonException(e);
}
}public List queryObjects(final String hql) throwsCommonException {
class Hc implements HibernateCallback{
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
return session.createQuery(hql).list();
}
}
try {
return this.getHibernateTemplate().executeFind(new Hc());
} catch (DataAccessException e) {
e.printStackTrace();
throw new CommonException(e);
}
}public List queryObjects(Class theClazz) throwsCommonException {
return this.queryObjects("from " +theClazz.getSimpleName());
}
}
6 、配置事务
<!-- 事务管理器,相当于TransactionProxy, 定义事务的开启、提交、回滚 -->
<bean id="htm"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="ti"class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="htm"/>
</property>
<property name="transactionAttributes">
<props>
<!-- key: 方法名称 -->
<propkey="insert*">PROPAGATION_REQUIRED</prop>
<propkey="update*">PROPAGATION_REQUIRED</prop>
<propkey="delete*">PROPAGATION_REQUIRED</prop>
<propkey="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 自动代理,代理业务对象 -->
<beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>common</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>ti</value>
</list>
</property>
</bean>7 、将 common 注入 Dao
<bean id="baseDao" abstract="true">
<property name="common">
<ref bean="common"/>
</property>
</bean>
<bean id="udao"class="com.aptech.dao.impl.UserDao"parent="baseDao"></bean>
<bean id="rdao"class="com.aptech.dao.impl.RoleDao"parent="baseDao"></bean>
8 、将Dao 注入Service
<bean id="grantService"class="com.aptech.service.impl.GrantService">
<property name="rdao"ref="rdao"></property>
<property name="udao"ref="udao"></property>
</bean>最近整理了学习材料,有需要的请下载,我放微信里面了,方便下载,还能交流,扫描我的二维码头像即可。