Spring——HibernateTemplate、hibernateDaoTemplate
Template
(1)spring在整合Hibernate进行事务管理的时候,会出现一些固定的代码,例如UserDAOImpl的save()方法中有如下代码:
Session s = null;
try {
s = sessionFactory.openSession();
s.getTransaction().begin();
s.save(user);
s.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
s.getTransaction().rollback();
} finally {
if (s != null) {
s.close();
s = null;
}
}
(2)当有多个事务时,这些代码将会重复,可以使用Spring的模版将其固定的部分写好,然后填入自己的逻辑即可
(3)在配置文件配置HibernateTemplate类,该类封装了sessionFactory,该类已经将固定的代码写好,其中调用了SessionFactory类的相关方法
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
(4)修改后的UserDAOImpl
package com.zgy.impl;
import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import com.zgy.dao.UserDAO;
import com.zgy.model.User;
@Component("u")
public class UserDAOImpl implements UserDAO {
private HibernateTemplate hiberanteTemplate;
public HibernateTemplate getHiberanteTemplate() {
return hiberanteTemplate;
}
@Resource
public void setHiberanteTemplate(HibernateTemplate hiberanteTemplate) {
this.hiberanteTemplate = hiberanteTemplate;
}
public void save(User user) {
/*
* 一般情况下,使用SessionFactory访问数据库时,需要用到以下代码,但是使用Template将可以简化
* Session s = null;
try {
s = sessionFactory.openSession();
s.getTransaction().begin();
s.save(user);
s.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
s.getTransaction().rollback();
} finally {
if (s != null) {
s.close();
s = null;
}
}
*/
hiberanteTemplate.save(user);
}
}
(5)由于hiberanteTemplate已经由Spring注入,所以直接调用HibernateTemplate类的save()方法即可。
(6)HibernateTemplate将Hibernate的异常封装为DataAccessException,它是Run提么Exception的子类
HibernateDaoSuppport
(1)可以抽象出一个SuperDAO,封装hibernateTemplate
package com.zgy.dao;
import javax.annotation.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
@Component
public class SuperDAO {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
(2)其他XXXDAO只需继承SuperDAO,即可获得hibernateTemplate
package com.zgy.impl;
import org.springframework.stereotype.Component;
import com.zgy.dao.SuperDAO;
import com.zgy.dao.LogDAO;
import com.zgy.model.Log;
@Component("logDAO")
public class LogDAOImpl extends SuperDAO implements LogDAO {
@Override
public void saveLog(Log log) {
super.getHibernateTemplate().save(log);
}
}
(3)另一种使用HibernateTemplate的方式是使用HibernateDaoSupport类
(4)在SuperDAO中继承HibernateDaoSupport
package com.zgy.dao;
import javax.annotation.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;
@Component
public class SuperDAO extends HibernateDaoSupport{
@Resource(name="hibernateTemplate")
public void setSuperHibernateTemplate(HibernateTemplate hibernateTemplate) {
super.setHibernateTemplate(hibernateTemplate);
}
}
(5)其他的XXXDAO继承SuperDAO
package com.zgy.impl;
import org.springframework.stereotype.Component;
import com.zgy.dao.SuperDAO;
import com.zgy.dao.LogDAO;
import com.zgy.model.Log;
@Component("logDAO")
public class LogDAOImpl extends SuperDAO implements LogDAO {
@Override
public void saveLog(Log log) {
super.getHibernateTemplate().save(log);
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。