`

hibernate getCurrentSession和Spring事务管理集成

阅读更多

 

 最近在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捕获了所有运行时异常,导致事务异常没有被抛出,事务没能拿到运行时异常,并没有回滚数据,对于非运行时异常,事务也不会产生回滚,除非使用Springrollback-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;
	}

 

 


 

 

分享到:
评论

相关推荐

    hibernate与spring整合demo

    4. AOP集成:Spring的AOP可以与Hibernate的事务管理结合,提供更灵活的事务策略。 四、整合步骤 1. 引入依赖:在项目中添加Spring和Hibernate的依赖库。 2. 配置Hibernate:创建Hibernate的配置文件(如hibernate....

    Spring与Hibernate集成中的session

    本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为一个轻量级的框架,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,它可以帮助我们解耦应用程序...

    hibernate和spring学习文档

    Hibernate和Spring的整合极大地简化了Java Web开发中的数据访问层,降低了数据库操作的复杂性,同时通过Spring的管理,使得事务处理、对象生命周期更加易于控制。通过熟练掌握这两者的结合,开发者可以构建出高效、...

    Hibernate4Spring3

    整合Hibernate4与Spring3的主要目的是将Spring的控制反转(IoC)和事务管理与Hibernate的ORM能力相结合,以创建更易于维护和扩展的Java应用程序。以下是一些关键的知识点: 1. **依赖注入**:Spring通过DI机制,...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    总结来说,这篇博客文章可能探讨了在使用Hibernate时,通过SessionFactory().getCurrentSession()获取Session的技巧和注意事项,包括如何正确配置Spring事务管理、理解线程绑定的Session机制,以及如何利用源码和...

    springboot集成hibernate

    在本文中,我们将深入探讨如何将Spring Boot框架与Hibernate ORM集成,特别是在不使用JPA(Java Persistence API)的情况下。Spring Boot以其便捷的自动配置和简化Java应用开发而广受欢迎,而Hibernate作为Java领域...

    Spring整合hibernate

    随着Hibernate的更新,特别是SessionFactory.getCurrentSession()的出现,可以直接在Spring的事务范围内获取和管理Session,使得直接使用HibernateAPI成为可能。 2. **使用SessionFactory.getCurrentSession()** ...

    Spring源代码解析(八):Spring驱动Hibernate的实现.doc

    总的来说,Spring通过`LocalSessionFactoryBean`实现对Hibernate的驱动,它将数据源、事务管理和配置信息集成在一起,创建出适应Spring管理的`SessionFactory`。这种集成方式使得开发者无需过多关注底层细节,可以...

    hibernate-spring整合

    这种整合提供了强大的数据库操作能力,并且简化了项目的结构和管理。 Spring是一个全功能的开发框架,它提供了依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问/集成、MVC框架等核心功能。Spring通过其...

    spring和hibernate接合实例

    当Spring与Hibernate结合时,Spring可以管理Hibernate的SessionFactory和Session实例,这样我们就能够在Spring的上下文中透明地使用Hibernate。Spring提供了LocalSessionFactoryBean和HibernateTransactionManager等...

    struts.hibernate.spring整合jar包大全

    Spring的DI可以管理Struts2的Action和Hibernate的SessionFactory,使得对象的创建和管理变得更加简单。同时,Spring的AOP可以用于事务管理,确保业务逻辑的正确执行。 2. **数据源配置** 在整合过程中,需要配置...

    hibernate spring 整合的问题

    总的来说,整合Hibernate和Spring是一项常见的任务,它需要开发者对两个框架有深入的理解,并且要熟悉Spring的配置机制和事务管理。在实际开发中,遇到问题时,查阅源码、使用合适工具和不断学习是解决问题的关键。

    Java事务管理学习之Spring和Hibernate详解

    在Spring和Hibernate这两个流行的Java开发框架中,事务管理被集成在一起,提供了一种高效且灵活的方式来处理事务。这篇文章将深入探讨Spring和Hibernate整合后的事务管理,以及如何在实践中应用这些概念。 首先,...

    SSH整合学习笔记之spring与hibernate整合(二)之c3p0

    通过这样的整合,Spring负责管理事务和对象生命周期,而Hibernate负责数据库操作,c3p0则在二者之间提供高效的数据源管理,形成一个强大的Java企业级应用开发框架。这个过程不仅简化了代码,还提高了系统的稳定性...

    SessionFactory.getCurrentSession与openSession的区别

    理解它们的区别对于优化数据访问性能和管理事务至关重要。 SessionFactory是Hibernate的核心对象,它负责创建Session实例。SessionFactory在应用程序启动时创建一次,然后在整个应用程序生命周期中重复使用。...

    ssh中getCurrentSession的使用

    在Java开发中,SSH通常指的是Struts、Spring和Hibernate这三大框架的集成,它们用于构建企业级Web应用程序。在描述中提到的"ssh中getCurrentSession的使用",实际上可能是指在SSH集成框架中使用Hibernate框架时,...

    Spring与Hibernate框架整合案例之数据库添加数据(经典入门案例,适合初学者,不看后悔)

    在IT领域,Spring和Hibernate是两个非常重要的Java框架,它们分别负责不同的职责。...通过这个教程,你可以学习到Spring的依赖注入、AOP、事务管理以及Hibernate的ORM机制,为后续更深入的学习打下坚实的基础。

    Spring视频教程(3)

    在这个部分,讲解了如何在Spring中配置和管理多对一的关系。多对一关联映射是数据库设计中常见的一种关系,例如一个部门有多个员工。通过Hibernate的注解或XML配置,可以轻松地在实体类之间建立这种关系,并进行...

    详细解释Spring与Hibernate的整合原理

    当我们将 Spring 与 Hibernate 整合时,主要目的是让 Spring 的 IoC 容器管理 Hibernate 的核心接口 `SessionFactory`,以及利用 Spring 提供的声明式事务管理机制来处理事务。这样做的好处在于可以减少代码量、提高...

    Spring+Hibernate程序架设步骤.doc

    Spring提供了一个全面的编程和配置模型,用于管理企业级应用程序的复杂性,而Hibernate则是Java世界中广泛使用的ORM解决方案,使得开发者可以更加方便地操作数据库。下面我们将详细介绍Spring和Hibernate整合的步骤...

Global site tag (gtag.js) - Google Analytics