都说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(); } } }
相关推荐
本文将深入探讨在业务层实现Hibernate事务控制的方法,特别关注通过动态代理技术来实现对业务对象(BO)的事务控制。 #### 二、问题背景 在传统的基于DAO(Data Access Object)模式的应用程序中,每个DAO类通常...
- 在DAO层,使用Hibernate的Session和Query对象进行数据库操作,Spring会在事务的上下文中管理这些操作。 4. **测试**: - 编写测试用例,模拟正常情况和异常情况,确保事务管理能够正确地进行提交和回滚。 这个...
接着,我们使用`ProxyFactoryBean`为业务层创建了一个代理,这样在调用业务层接口时,就会自动应用之前定义好的事务管理策略。 #### 四、总结 通过上述配置,我们可以清晰地看到如何在Spring框架中利用AOP机制实现...
Spring的声明式事务管理是基于AOP实现的,它可以在方法执行前后自动地进行事务的开启、提交、回滚等操作。这种方式极大地简化了事务处理的代码,使得业务逻辑与事务管理解耦。 Hibernate是一个流行的ORM(对象关系...
在Java开发领域,Spring框架和Hibernate...Spring通过AOP代理在合适的时候调用Hibernate的Session方法,控制事务的开启、提交、回滚等行为。以下是一段示例代码,展示了如何在Spring中配置Hibernate事务管理: ```xml ...
DAO实现类使用Hibernate API进行数据库操作,如保存、更新、删除和查询对象。Spring的JdbcTemplate或JPARepository也可以用来简化数据访问。同时,测试时可以利用Spring的Mockito或DBUnit进行单元测试,确保持久层的...
7. 实践整合Hibernate和Spring,编写DAO层和事务管理代码。 复习过程中,可以通过选择题、填空题以及案例分析来巩固理论知识,加深对这两个框架的理解。确保能够熟练地将它们应用于实际项目开发中,提升开发效率和...
通过这种方式,Spring与Hibernate结合使用,可以轻松地管理事务,确保数据的一致性,并且能够很好地与其他Spring服务集成,如数据访问对象(DAO)、服务层等。此外,Spring的这种事务管理方式使得在非J2EE环境中也能...
同样,Spring的声明式事务管理也可以应用到Hibernate上,只需将@Transactional注解添加到使用Hibernate的方法上,Spring就会自动处理事务的生命周期。此外,Spring还支持使用Hibernate的SessionFactory和...
hibernate dao 操作(一个basedao全部搞定) 两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理...
--定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理--> <bean id="userDAO" class="com.dao.impl.UserDAOHibernate"> class="com.service.impl.UserManagerImpl"> ...
Spring 提供了 HibernateTemplate 类,它是一个简化版的 Hibernate Session 操作工具,自动处理了 Session 的创建、关闭以及异常处理,使得开发者无需在 DAO 层处理复杂的事务控制。此外,Spring 还支持使用 AOP 来...
Spring的`HibernateDaoSupport`类为Hibernate的DAO实现提供了便捷的基类,它包含了SessionFactory的自动管理以及事务处理等支持。开发者可以通过继承`HibernateDaoSupport`,然后通过注入`SessionFactory`来快速构建...
- **反向工程**: 使用Hibernate的反向工程功能自动生成DAO层代码。 - **事务处理**: 在DAO层添加基本的事务处理逻辑。 - **测试**: 编写测试类验证DAO层功能是否正确。 ##### 4. 添加Spring功能 - **集成Spring**: ...
3. **动态代理**:使用Java的反射API或第三方库如CGLIB、ASM等,动态生成DAO的实现,减少手动编写大量相似的DAO代码。 4. **ORM框架**:像Hibernate、MyBatis这样的ORM框架自动处理了大部分DAO工作,通过配置文件或...
4. **Service层**:Spring将管理这些服务类,它们通过DAO层与数据库交互,实现业务逻辑。 5. **事务配置**:Spring提供了声明式事务管理,可以在`applicationContext.xml`中配置。 6. **测试类**:如`...
3. 创建DAO接口及实现:定义数据访问接口,使用Spring的`@Repository`注解标记实现类,便于自动代理事务管理。 4. 配置Struts:编写`struts.xml`,定义Action类及其对应的视图,同时可以配置拦截器以实现权限控制等...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了搭建Hibernate框架所必需的19个完整JAR包,这些库文件是...
- **Hibernate**:主要负责持久层(Data Access Object,DAO),提供了一种ORM(Object Relational Mapping)解决方案,使得对数据库的操作更加简便。 #### 二、使用IoC进行整合 **IoC(Inversion of Control,...