最近在Java项目中使用到了Spring和hibernate,其中使用到的事务管理,
spring 配置文件 如下
public static void main(String[] args) { ApplicationContext ctx=SpringAppContext.getInstance().getApplicationContext(); NoticeDao g=ctx.getBean(NoticeDao.class); /*****独立执行saveNotice()和saveNotice1()********/ System.out.println(g.saveNotice()); g.saveNotice1(); /*******在saveNotice2()中执行saveNotice()和saveNotice1()*******/ /*g.saveNotice2();*/ } @Override @Transactional(propagation=Propagation.REQUIRED) public Session saveNotice() { // TODO Auto-generated method stub Session session= this.database.getSf().getCurrentSession(); System.out.println("saveNotice():"+session); session.createSQLQuery("insert into notice(content) value('aaa');").executeUpdate(); //session.createSQLQuery("insert into notice(content) value(bbb);").executeUpdate(); //session.close(); return session; } @Override @Transactional(propagation=Propagation.REQUIRED) public void saveNotice1() { // TODO Auto-generated method stub Session session= this.database.getSf().getCurrentSession(); System.out.println("saveNotice1():"+session); //session.createSQLQuery("insert into notice(content) value('aaa');").executeUpdate(); session.createSQLQuery("insert into notice(content) value(bbb);").executeUpdate(); //session.close(); } @Override @Transactional(propagation=Propagation.REQUIRED) public void saveNotice2() { saveNotice(); saveNotice1(); }
1执行 saveNotice2()
结果如下
saveNotice():SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@2a898881 updates=org.hibernate.engine.spi.ExecutableList@16c63f5 deletions=org.hibernate.engine.spi.ExecutableList@35229f85 orphanRemovals=org.hibernate.engine.spi.ExecutableList@6d3c5255 collectionCreations=org.hibernate.engine.spi.ExecutableList@b1712f3 collectionRemovals=org.hibernate.engine.spi.ExecutableList@6986bbaf collectionUpdates=org.hibernate.engine.spi.ExecutableList@4879dfad collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@4758820d unresolvedInsertDependencies=UnresolvedEntityInsertActions[]]) Hibernate: insert into notice (content) value('aaa'); saveNotice1():SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@2a898881 updates=org.hibernate.engine.spi.ExecutableList@16c63f5 deletions=org.hibernate.engine.spi.ExecutableList@35229f85 orphanRemovals=org.hibernate.engine.spi.ExecutableList@6d3c5255 collectionCreations=org.hibernate.engine.spi.ExecutableList@b1712f3 collectionRemovals=org.hibernate.engine.spi.ExecutableList@6986bbaf collectionUpdates=org.hibernate.engine.spi.ExecutableList@4879dfad collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@4758820d unresolvedInsertDependencies=UnresolvedEntityInsertActions[]]) Hibernate: insert into notice (content) value(bbb); Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
通过分析结果 可知
saveNotice2()加入的事务处理,insert('aaa') 正常执行,insert(bbb)异常,数据库结果显示并没有插入aaa,说明事物遇到异常产生了回滚,事务处理,而通过打印对比session,可以在saveNotice2()拿到的currentsession是相同的,而事实上SaveNotice()和 saveNotice1() 都加入过session,按照getCurrentSession应该是事务执行完自动commit和关闭session,结果应该是两个session不同,且插入’aaa‘和bbb互为独立事务,但实际上回滚了数据,说明并没有已他们的事务执行或者忽略了其各自的事务,我个人猜想应该和事务传播行 (propagation=Propagation.REQUIRED)有关;另外getCurrentSession在同一事务下,拿到的session永远是同一个
2分别执行
NoticeDao g=ctx.getBean(NoticeDao.class); System.out.println(g.saveNotice()); g.saveNotice1();
结果如下
saveNotice():SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@2a898881 updates=org.hibernate.engine.spi.ExecutableList@16c63f5 deletions=org.hibernate.engine.spi.ExecutableList@35229f85 orphanRemovals=org.hibernate.engine.spi.ExecutableList@6d3c5255 collectionCreations=org.hibernate.engine.spi.ExecutableList@b1712f3 collectionRemovals=org.hibernate.engine.spi.ExecutableList@6986bbaf collectionUpdates=org.hibernate.engine.spi.ExecutableList@4879dfad collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@4758820d unresolvedInsertDependencies=UnresolvedEntityInsertActions[]]) Hibernate: insert into notice (content) value('aaa'); SessionImpl(<closed>) saveNotice1():SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@2cc3ad05 updates=org.hibernate.engine.spi.ExecutableList@710b18a6 deletions=org.hibernate.engine.spi.ExecutableList@119020fb orphanRemovals=org.hibernate.engine.spi.ExecutableList@3d9f6567 collectionCreations=org.hibernate.engine.spi.ExecutableList@c055c54 collectionRemovals=org.hibernate.engine.spi.ExecutableList@25e2ab5a collectionUpdates=org.hibernate.engine.spi.ExecutableList@35e5d0e5 collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@73173f63 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]]) Hibernate: insert into notice (content) value(bbb); Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
通过结果分析,getCurrentSession中的session在事务完成后会自动commit和close,getCurrentSession在相互独立事务中拿到的session是不同的,另外 getCurrentSession得到的session是和事务绑定的,要用getCurrentSession生产的session,就必须有事务环境,否则会抛出
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
一开始使用事务由于使用了 aop捕获了所有运行时异常,导致事务异常没有被抛出,事务没能拿到运行时异常,并没有回滚数据,对于非运行时异常,事务也不会产生回滚,除非使用Spring的rollback-for配置,指定相关异常执行回滚
<!-- 切面捕获异常并写入日志 --> <!-- <bean id="aspectBean" class="dw.aop.log.Aspect" /> --> <!-- Aop配置 expression 表达式 配置dw包下所有类及子类或接口的所有方法 --> <!-- <aop:config> <aop:aspect id="aspect" ref="aspectBean"> <aop:pointcut id="logService" expression="execution(* dw..*.*(..))" /> <aop:before pointcut-ref="logService" method="doBefore" /> <aop:after pointcut-ref="logService" method="doAfter" /> <aop:around pointcut-ref="logService" method="doAround" /> </aop:aspect> </aop:config> -->
Aspect.java
/** * 环绕通知:包围一个连接点的通知,可以在方法的调用前后完成自定义的行为,也可以选择不执行 * 类似Web中Servlet规范中的Filter的doFilter方法。 * * @param pjp * 当前进程中的连接点 * @return * @throws Throwable */ public Object doAround(ProceedingJoinPoint pjp){ Object retVal = null; try { retVal = pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); logger.error(pjp.getTarget().getClass().getName() + "类的方法:" + pjp.getSignature().getName()+ pjp.getSignature()+"执行出错",e); } return retVal; }
相关推荐
4. AOP集成:Spring的AOP可以与Hibernate的事务管理结合,提供更灵活的事务策略。 四、整合步骤 1. 引入依赖:在项目中添加Spring和Hibernate的依赖库。 2. 配置Hibernate:创建Hibernate的配置文件(如hibernate....
本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为一个轻量级的框架,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,它可以帮助我们解耦应用程序...
Hibernate和Spring的整合极大地简化了Java Web开发中的数据访问层,降低了数据库操作的复杂性,同时通过Spring的管理,使得事务处理、对象生命周期更加易于控制。通过熟练掌握这两者的结合,开发者可以构建出高效、...
整合Hibernate4与Spring3的主要目的是将Spring的控制反转(IoC)和事务管理与Hibernate的ORM能力相结合,以创建更易于维护和扩展的Java应用程序。以下是一些关键的知识点: 1. **依赖注入**:Spring通过DI机制,...
总结来说,这篇博客文章可能探讨了在使用Hibernate时,通过SessionFactory().getCurrentSession()获取Session的技巧和注意事项,包括如何正确配置Spring事务管理、理解线程绑定的Session机制,以及如何利用源码和...
在本文中,我们将深入探讨如何将Spring Boot框架与Hibernate ORM集成,特别是在不使用JPA(Java Persistence API)的情况下。Spring Boot以其便捷的自动配置和简化Java应用开发而广受欢迎,而Hibernate作为Java领域...
随着Hibernate的更新,特别是SessionFactory.getCurrentSession()的出现,可以直接在Spring的事务范围内获取和管理Session,使得直接使用HibernateAPI成为可能。 2. **使用SessionFactory.getCurrentSession()** ...
总的来说,Spring通过`LocalSessionFactoryBean`实现对Hibernate的驱动,它将数据源、事务管理和配置信息集成在一起,创建出适应Spring管理的`SessionFactory`。这种集成方式使得开发者无需过多关注底层细节,可以...
这种整合提供了强大的数据库操作能力,并且简化了项目的结构和管理。 Spring是一个全功能的开发框架,它提供了依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问/集成、MVC框架等核心功能。Spring通过其...
当Spring与Hibernate结合时,Spring可以管理Hibernate的SessionFactory和Session实例,这样我们就能够在Spring的上下文中透明地使用Hibernate。Spring提供了LocalSessionFactoryBean和HibernateTransactionManager等...
Spring的DI可以管理Struts2的Action和Hibernate的SessionFactory,使得对象的创建和管理变得更加简单。同时,Spring的AOP可以用于事务管理,确保业务逻辑的正确执行。 2. **数据源配置** 在整合过程中,需要配置...
总的来说,整合Hibernate和Spring是一项常见的任务,它需要开发者对两个框架有深入的理解,并且要熟悉Spring的配置机制和事务管理。在实际开发中,遇到问题时,查阅源码、使用合适工具和不断学习是解决问题的关键。
在Spring和Hibernate这两个流行的Java开发框架中,事务管理被集成在一起,提供了一种高效且灵活的方式来处理事务。这篇文章将深入探讨Spring和Hibernate整合后的事务管理,以及如何在实践中应用这些概念。 首先,...
通过这样的整合,Spring负责管理事务和对象生命周期,而Hibernate负责数据库操作,c3p0则在二者之间提供高效的数据源管理,形成一个强大的Java企业级应用开发框架。这个过程不仅简化了代码,还提高了系统的稳定性...
理解它们的区别对于优化数据访问性能和管理事务至关重要。 SessionFactory是Hibernate的核心对象,它负责创建Session实例。SessionFactory在应用程序启动时创建一次,然后在整个应用程序生命周期中重复使用。...
在Java开发中,SSH通常指的是Struts、Spring和Hibernate这三大框架的集成,它们用于构建企业级Web应用程序。在描述中提到的"ssh中getCurrentSession的使用",实际上可能是指在SSH集成框架中使用Hibernate框架时,...
在IT领域,Spring和Hibernate是两个非常重要的Java框架,它们分别负责不同的职责。...通过这个教程,你可以学习到Spring的依赖注入、AOP、事务管理以及Hibernate的ORM机制,为后续更深入的学习打下坚实的基础。
在这个部分,讲解了如何在Spring中配置和管理多对一的关系。多对一关联映射是数据库设计中常见的一种关系,例如一个部门有多个员工。通过Hibernate的注解或XML配置,可以轻松地在实体类之间建立这种关系,并进行...
当我们将 Spring 与 Hibernate 整合时,主要目的是让 Spring 的 IoC 容器管理 Hibernate 的核心接口 `SessionFactory`,以及利用 Spring 提供的声明式事务管理机制来处理事务。这样做的好处在于可以减少代码量、提高...
Spring提供了一个全面的编程和配置模型,用于管理企业级应用程序的复杂性,而Hibernate则是Java世界中广泛使用的ORM解决方案,使得开发者可以更加方便地操作数据库。下面我们将详细介绍Spring和Hibernate整合的步骤...