`

使用代理实现Hibernate Dao层自动事务

阅读更多

都说spring利用AOP实现自动事务处理机制非常好,但在只有hibernate这个框架情况下,我们开启session、管理事务就往往很麻烦。

public void save(Object obj){
		Session session = this.getSession();
		Transaction tran = session.beginTransaction();
		try {
			session.save(obj);
			tran.commit();
		} catch (Exception e) {
			//事务回滚
			if(tran.isActive()){
				tran.rollback();
			}
		}finally{
			//关闭session
			if(session!=null){
				session.close();
			}
		}
	}

 

 

最近也刚学会动态代理和反射,我就在想,是否可以用代理+反射实现session自动创建销毁,事务自动提交。

BaseDaoImpl需要有两个公共变量session和transaction,每个方法体里只需要写CRUD代码即可:

public class BaseDaoImpl implements BaseDao {
	public Session session = null;
	public Transaction tran = null;

	@Override
	public void delete(Class clazz, Serializable id) throws Exception {
		// TODO Auto-generated method stub
		Object obj = session.load(clazz, id);
		session.delete(obj);
	}
}

 

最后看最重要的部分,实现session和transaction的动态代理类:

package com.bless.hibernatedemo.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class DaoProxy implements InvocationHandler {

	private Object obj;

	// 绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
	// Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
	public Object bindRelation(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
				.getClass().getInterfaces(), this);
	}

	// 拦截关联的这个实现类的方法被调用时将被执行
	@Override
	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {
		Class clazz = obj.getClass();

		// 反射获取session和tran两个属性对象
		Field fSession = clazz.getField("session");
		Field fTran = clazz.getField("tran");

		Session session = HibernateUtils.currentSession();
		// 给Dao中的session赋值
		fSession.set(obj, session);
		// 然后通过session打开事务
		Transaction tran = session.beginTransaction();
		// 再将事务对象set到对象中
		fTran.set(obj, tran);
		
		try {
			// 哇咔咔,执行dao方法
			Object result = arg1.invoke(obj, arg2);
			// 当然事务是要提交滴
			tran.commit();

			return result;
		} catch (Exception e) {
			// 发生异常,事务回滚
			if (tran.isActive()) {
				tran.rollback();
			}
			throw e;
		} finally {
			// session关闭操作
			if (session != null) {
				HibernateUtils.colseSession();
			}
		}
	}
}

 

 

最后测试一下:

public class HibernateTest extends TestCase {
	public void testSave(){
		BaseDaoImpl baseDaoImpl = new BaseDaoImpl();
		DaoProxy proxy = new DaoProxy();
		BaseDao baseDao = (BaseDao) proxy.bindRelation(baseDaoImpl);
		
		try {
			//删除User表中id为1的字段
			baseDao.delete(User.class,1);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

2
2
分享到:
评论

相关推荐

    Hibernate业务层控制Hibernate业务层控制

    本文将深入探讨在业务层实现Hibernate事务控制的方法,特别关注通过动态代理技术来实现对业务对象(BO)的事务控制。 #### 二、问题背景 在传统的基于DAO(Data Access Object)模式的应用程序中,每个DAO类通常...

    Spring+Hibernate注解事务实例

    - 在DAO层,使用Hibernate的Session和Query对象进行数据库操作,Spring会在事务的上下文中管理这些操作。 4. **测试**: - 编写测试用例,模拟正常情况和异常情况,确保事务管理能够正确地进行提交和回滚。 这个...

    Spring配置事务在DAO层和业务逻辑层

    接着,我们使用`ProxyFactoryBean`为业务层创建了一个代理,这样在调用业务层接口时,就会自动应用之前定义好的事务管理策略。 #### 四、总结 通过上述配置,我们可以清晰地看到如何在Spring框架中利用AOP机制实现...

    声明式事务控制spring+hibernate集成

    Spring的声明式事务管理是基于AOP实现的,它可以在方法执行前后自动地进行事务的开启、提交、回滚等操作。这种方式极大地简化了事务处理的代码,使得业务逻辑与事务管理解耦。 Hibernate是一个流行的ORM(对象关系...

    用Hibernate和Spring开发事务持久层.rar_spring

    在Java开发领域,Spring框架和Hibernate...Spring通过AOP代理在合适的时候调用Hibernate的Session方法,控制事务的开启、提交、回滚等行为。以下是一段示例代码,展示了如何在Spring中配置Hibernate事务管理: ```xml ...

    用 hibernate 和 spring 开发持久层.doc

    DAO实现类使用Hibernate API进行数据库操作,如保存、更新、删除和查询对象。Spring的JdbcTemplate或JPARepository也可以用来简化数据访问。同时,测试时可以利用Spring的Mockito或DBUnit进行单元测试,确保持久层的...

    hibernate+spring复习大纲

    7. 实践整合Hibernate和Spring,编写DAO层和事务管理代码。 复习过程中,可以通过选择题、填空题以及案例分析来巩固理论知识,加深对这两个框架的理解。确保能够熟练地将它们应用于实际项目开发中,提升开发效率和...

    spring配置hibernate事务

    通过这种方式,Spring与Hibernate结合使用,可以轻松地管理事务,确保数据的一致性,并且能够很好地与其他Spring服务集成,如数据访问对象(DAO)、服务层等。此外,Spring的这种事务管理方式使得在非J2EE环境中也能...

    spring分别与jdbc和hibernate结合的事务控制--案例

    同样,Spring的声明式事务管理也可以应用到Hibernate上,只需将@Transactional注解添加到使用Hibernate的方法上,Spring就会自动处理事务的生命周期。此外,Spring还支持使用Hibernate的SessionFactory和...

    springMVC + Hibernate 工程模板

    hibernate dao 操作(一个basedao全部搞定) 两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    --定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理--> <bean id="userDAO" class="com.dao.impl.UserDAOHibernate"> class="com.service.impl.UserManagerImpl"> ...

    浅谈Spring+Hibernate整合(共16页).doc

    Spring 提供了 HibernateTemplate 类,它是一个简化版的 Hibernate Session 操作工具,自动处理了 Session 的创建、关闭以及异常处理,使得开发者无需在 DAO 层处理复杂的事务控制。此外,Spring 还支持使用 AOP 来...

    DAO模式设计

    Spring的`HibernateDaoSupport`类为Hibernate的DAO实现提供了便捷的基类,它包含了SessionFactory的自动管理以及事务处理等支持。开发者可以通过继承`HibernateDaoSupport`,然后通过注入`SessionFactory`来快速构建...

    spring_struts_hibernate实例开发

    - **反向工程**: 使用Hibernate的反向工程功能自动生成DAO层代码。 - **事务处理**: 在DAO层添加基本的事务处理逻辑。 - **测试**: 编写测试类验证DAO层功能是否正确。 ##### 4. 添加Spring功能 - **集成Spring**: ...

    不要重复 DAO !

    3. **动态代理**:使用Java的反射API或第三方库如CGLIB、ASM等,动态生成DAO的实现,减少手动编写大量相似的DAO代码。 4. **ORM框架**:像Hibernate、MyBatis这样的ORM框架自动处理了大部分DAO工作,通过配置文件或...

    spring+hibernate整合demo

    4. **Service层**:Spring将管理这些服务类,它们通过DAO层与数据库交互,实现业务逻辑。 5. **事务配置**:Spring提供了声明式事务管理,可以在`applicationContext.xml`中配置。 6. **测试类**:如`...

    spring_struts_hibernate集成(干净版)

    3. 创建DAO接口及实现:定义数据访问接口,使用Spring的`@Repository`注解标记实现类,便于自动代理事务管理。 4. 配置Struts:编写`struts.xml`,定义Action类及其对应的视图,同时可以配置拦截器以实现权限控制等...

    hibernate完整JAR包

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了搭建Hibernate框架所必需的19个完整JAR包,这些库文件是...

    SSH整合 struts+hibernate+spring

    - **Hibernate**:主要负责持久层(Data Access Object,DAO),提供了一种ORM(Object Relational Mapping)解决方案,使得对数据库的操作更加简便。 #### 二、使用IoC进行整合 **IoC(Inversion of Control,...

Global site tag (gtag.js) - Google Analytics