Spring——HibernateTemplate、hibernateDaoTemplate

Template

(1)spring在整合Hibernate进行事务管理的时候,会出现一些固定的代码,例如UserDAOImplsave()方法中有如下代码:

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)HibernateTemplateHibernate的异常封装为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);

}

}



技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。