练习个项目,发现执行到dao层里的方法时总是抛org.hibernate.HibernateException:xxxxx is not vaild without active transaction. 例如执行session.save(xxxEntity) 就抛出 save is not vaild without active transaction.
找到好多的教程都说是要在配置hibernateProperties时加一条:
如果采用jdbc独立引用程序配置如下:
<property name="hibernate.current_session_context_class">thread</property>
如果采用了JTA事务配置如下
<property name="hibernate.current_session_context_class">jta</property>
注:真实情况是加了不一定好用,需要理解正确才能判断出到底加还是不加。
理解为在事务管理时,session所处容器(环境)。
就是说用sessionFactory的getCurrentSession()得到的那个session总是位于容器里的同一个实例。这样,在业务层管理的一个方法(对应一个事务)中执行的多条dao层方法(每个方法都会去打开currentSession) 中用的是一个session。 容器会管理它的生命周期,我们就不用手动的去close 掉session. 这也是通常用getCurrentSession. 不用openSession方法打开一个新session的原因。
请理解上面这段话。当你用spring为业务层管理事务时,无论你用@Transactional注解,还是配置在spring的xml文件中,你都会发现加了上面的那句配置会导致抛出org.hibernate.HibernateException:xxxxx is not vaild without active transaction。
你会纳闷:明明设置了事务管理啊~!还是spring的事务管理,名角儿,怎么能说没有活动的事务设置呢? 这是因为session 和transaction不在同一个容器(环境)里造成的。session是在普通的thread里,而transaction是spring的context里。 我感觉,后者范围小一些,到不了thread里去为其session进行事务管理,所以session找不到事务。怎么办?
很简单,去掉那行hibernate.current_session_context_class的配置。这样session就交给spring的context了。
PS:找了半天的相关文章找不到一个解决方法,终于发现http://blog.csdn.net/javavenus/archive/2010/08/12/5806164.aspx里有,看过后才大彻大悟,遂改了程序,运行成功后,总结于此
分享到:
相关推荐
在Spring中,我们可以配置`PlatformTransactionManager`接口的实现类,如`HibernateTransactionManager`,它会自动感知Hibernate Session并管理事务。通过声明式事务管理,我们只需在方法上添加`@Transactional`注解...
2. Hibernate事务管理:使用`HibernateTransactionManager`结合SessionFactory进行事务控制。 3. AOP(面向切面编程)在事务管理中的应用:`TransactionInterceptor`基于AOP拦截方法调用,处理事务。 4. 配置事务...
在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...
3. **Hibernate事务配置:**在Spring中,需要配置Hibernate SessionFactory,并将其注入到需要进行数据库操作的服务中。同时,通过`PlatformTransactionManager`接口(如HibernateTransactionManager)配置事务管理...
本项目是关于如何使用Spring MVC与Hibernate结合来实现事务管理的实践教程,通过MyEclipse自动生成所需的包和配置文件。这里将详细讲解这一过程,以及涉及到的关键知识点。 首先,Spring MVC作为Spring框架的一部分...
在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...
当我们需要在应用程序中进行事务管理时,Spring提供了一种声明式的方式,使得事务配置更为简洁。本篇将详细介绍如何在Spring 3和Hibernate 4中通过注解来实现声明式事务管理。 首先,我们需要在项目中引入Spring和...
在Spring与Hibernate的结合下,MySQL的事务控制可以通过设置不同的隔离级别(如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)来优化并发性能和避免数据竞争问题。 在实际开发中,我们还需要...
5. **Spring3.0的配置**:Spring3.0引入了许多新特性,如AOP表达式、注解驱动的事务管理、JSR-303/JSR-349验证支持等。在配置Memcached时,Spring可以用来管理缓存策略,例如使用`@Cacheable`和`@CacheEvict`注解来...
在`Spring_1800_Spring_Hibernate_Transaction_Annotation`这个压缩包文件中,很可能包含了使用注解方式实现Spring整合Hibernate事务处理的相关示例代码和配置文件。通过阅读和理解这些代码,你可以更好地掌握这一...
Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...
这个实例将涵盖如何创建一个简单的Spring+Hibernate项目,设置事务管理,编写带有@Transactional注解的服务类,以及对应的DAO类。同时,你还会学到如何在单元测试中验证事务处理的正确性。 通过实践这个实例,你...
5. **配置Spring和Hibernate**:在Spring 3中,我们需要配置Hibernate SessionFactory,并将其与Spring的事务管理器相结合。这通常通过XML配置文件或Java配置类完成。同时,需要为数据源、SessionFactory和事务管理...
本主题将深入探讨Hibernate的编程式事务管理和Spring AOP的声明式事务管理,以及两者如何在实际项目中集成使用。 **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的...
Spring MVC、Spring 和 Hibernate 是Java开发中非常流行的三大框架,它们分别用于Web开发、依赖管理和持久层操作。这个"springmvc spring hibernate整合Demo"旨在帮助初学者理解如何将这三个框架协同工作,实现一个...
`HibernateTransactionManager`是Spring提供的专门用于管理Hibernate事务的类,它会自动处理Hibernate Session和JDBC Connection的开启、提交、回滚。 三、配置Spring事务管理 在Spring的配置文件中,我们需要添加...
在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...
2. **Hibernate事务**: Hibernate本身也提供了一种事务管理机制,但在Spring环境中,我们通常使用Spring的事务管理器来协调。当@Transactional注解应用于方法上,Spring会在该方法执行前后自动管理事务的开始和结束...
2. **Hibernate事务管理**: - Hibernate提供了`Session`和`SessionFactory`,它们是与数据库交互的主要对象。`Session`负责单个数据库会话,而`SessionFactory`在整个应用程序生命周期中只创建一次,用于生成`...