0 0

spring3与hibernate4整合session问题0

问题描述:
整合spring3与hibernate4时,发生错误:nested exception is org.hibernate.HibernateException: No Session found for current thread

之后查找资料,添加:<prop key="hibernate.current_session_context_class">thread</prop>属性,报错:org.hibernate.HibernateException: createQuery is not valid without active transaction,
查找资料说,删除上面我添加的那个属性,我被陷入死循环了。
代码如下

配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
	
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:config/jdbc.properties</value>
			</list>
		</property>
	</bean>
	
	<!--数据源-->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
		<property name="driverClass">  
			<value>${mysql.driver}</value>
		</property> 
		<property name="jdbcUrl">  
			<value>${mysql.url}</value>  
		</property>
		<property name="user">
			<value>${mysql.userName}</value>
		</property>  
		<property name="password">
			<value>${mysql.password}</value>
		</property>
		<property name="acquireIncrement">
			<value>${c3p0.acquireIncrement}</value>
		</property>    
		<property name="initialPoolSize">
			<value>${c3p0.initialPoolSize}</value>
		</property>
		<property name="minPoolSize">
			<value>${c3p0.minPoolSize}</value>
		</property>
		<property name="maxPoolSize">
			<value>${c3p0.maxPoolSize}</value>
		</property>
		<property name="maxIdleTime">
			<value>${c3p0.maxIdleTime}</value>
		</property>
		<property name="idleConnectionTestPeriod">
			<value>${c3p0.idleConnectionTestPeriod}</value>
		</property>
		<property name="maxStatements">
			<value>${c3p0.maxStatements}</value>
		</property>
		<property name="numHelperThreads">
			<value>${c3p0.numHelperThreads}</value>
		</property>
		<property name="testConnectionOnCheckout">
			<value>${c3p0.testConnectionOnCheckout}</value>
		</property>
		<property name="preferredTestQuery">
			<value>${c3p0.preferredTestQuery}</value>
		</property>
	</bean>
    
	<!-- Session 工厂配置 -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />     
		<property name="packagesToScan">
			<list>  
				<value>com..entity</value>  
			</list> 
		</property>  
		<property name="hibernateProperties">         
			<props>          
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>          
				<prop key="hibernate.show_sql">true</prop>  
				<!-- 解决no session found -->
                <prop key="hibernate.current_session_context_class">thread</prop> 
			</props>     
		</property> 
	</bean>

	<!-- 配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
		<property name="sessionFactory" ref="sessionFactory"/>  
	</bean> 

	<!-- 配置事物管理器,在*ServiceImpl里写@Transactional就可以启用事物管理 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	<tx:advice id="txAdvice" transaction-manager="transactionManager">  
		<tx:attributes>  
			<!-- 方法对应的传播属性 -->  
			<tx:method name="save*" propagation="REQUIRED" />  
			<tx:method name="add*" propagation="REQUIRED" />  
			<tx:method name="create*" propagation="REQUIRED" />  
			<tx:method name="insert*" propagation="REQUIRED" />  
			<tx:method name="update*" propagation="REQUIRED" />  
			<tx:method name="merge*" propagation="REQUIRED" />  
			<tx:method name="del*" propagation="REQUIRED" />  
			<tx:method name="remove*" propagation="REQUIRED" />  
			<tx:method name="put*" propagation="REQUIRED" />  
			<tx:method name="use*" propagation="REQUIRED"/>  
			<tx:method name="get*" propagation="REQUIRED" read-only="true" />  
			<tx:method name="count*" propagation="REQUIRED" read-only="true" />  
			<tx:method name="find*" propagation="REQUIRED" read-only="true" />  
			<tx:method name="list*" propagation="REQUIRED" read-only="true" />  
			<tx:method name="*" read-only="true" />  
		</tx:attributes>  
	</tx:advice>  
	
	<!-- 事务控制位置,一般在业务层service -->  
	<aop:config>  
		<aop:pointcut id="txPointcut" expression="execution(* com..service..*.*(..))" />  
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>  
	</aop:config>
</beans>




DAO
package com.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

public class BaseDao {
	@Autowired
	private SessionFactory sessionFactory;

	public Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

}



package com.test.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.test.BaseDao;
import com.test.dao.IUserDao;
import com.test.entity.User;

@Repository
public class UserDaoImpl extends BaseDao implements IUserDao{

	@SuppressWarnings("unchecked")
	@Override
	public List<User> findAllUsers() {
		String hql = "FROM User"; 
		Query query = getCurrentSession().createQuery(hql);  
		return query.list();  
	}

}


各层次的ioc都OK的,问题出在哪里,或者解答下原因也可以,我自己查找资料,谢谢了。
2014年5月14日 14:45

7个答案 按时间排序 按投票排序

0 0

采纳的答案

在web.xml配置

<filter>
<filter-name>lazyLoadingFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>lazyLoadingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2014年5月15日 00:06
0 0

方法有点问题
public Session getSession() {
Session session = null;
try {
session = sessionFactory.getCurrentSession();
} catch (HibernateException he) {
session = sessionFactory.openSession();
}
return session;
}

2016年8月17日 10:50
0 0

hibernate4获取session有一个限制,就是session必须在事务级别上才能获取到
你可以在你的service加上事务配置就没有问题了
例如

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" />
	<aop:config proxy-target-class="true">
		<aop:pointcut id="serviceMethod" expression=" execution(* 你的包名.service.impl..*(..))" />
		<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
	</aop:config>
	
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" />
			<tx:method name="load*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
			<tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
			<tx:method name="find*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
			<tx:method name="list*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
			<tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" />
		</tx:attributes>
	</tx:advice>

2014年5月15日 20:54
0 0

没有获取到受事务管理的session

2014年5月14日 23:01
0 0

<property name="packagesToScan">  
            <list>    
                <value>com..entity</value>    
            </list>   
        </property>   

改成这样试试 加载这个包下的所有实体类
<property name="packagesToScan">  
            <list>    
                <value>com..entity*</value>    
            </list>   
        </property> 

2014年5月14日 18:58
0 0

你加入了 注解的扫描了吗?
<!--  启动注解扫描 -->    
<context:component-scan base-package="com"/>
  

2014年5月14日 16:57
0 0

<property name="packagesToScan" value="com.foo.model" />

是否是这里配置错误?

2014年5月14日 15:36

相关推荐

    Struts2+Spring3+Hibernate4整合的jar包

    Struts2、Spring3和Hibernate4是Java Web开发中的三大框架,它们的整合极大地提高了开发效率,简化了项目结构,并提供了强大的功能。SSH(Struts2、Spring、Hibernate)是企业级应用开发的常见选择,这主要是因为...

    spring与hibernate的整合

    Spring 和 Hibernate 的整合是企业级 Java 应用开发中的常见实践,它将 Spring 框架的控制反转(IoC)和面向切面编程(AOP)优势与 Hibernate 的持久化能力相结合,提供了更高效、灵活的数据库操作。下面我们将深入...

    Spring3整合Hibernate4测试Demo

    **Spring3整合Hibernate4测试Demo** 在Java Web开发中,Spring和Hibernate是两个非常重要的框架。Spring是一个全面的后端应用程序框架,它提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及其他...

    springMVC+spring3=hibernate4整合的CURD项目

    Spring MVC、Spring 3 和 Hibernate 4 是三个在Java Web开发中非常重要的框架,它们的整合使得开发者可以构建高效、可维护的业务应用程序。在这个基于SSH的CURD(创建、读取、更新、删除)项目中,我们将深入探讨这...

    spring3 hibernate3 整合

    3. **数据访问对象(DAO)**:Spring的DAO支持包括定义DAO接口和实现类,以及使用HibernateTemplate或HibernateDaoSupport作为基础类,简化与Hibernate Session的交互。 4. **实体管理**:在Hibernate中,实体类是...

    最新项目系统:Struts2+Spring4+Hibernate4三大框架整合

    总的来说,"最新项目系统:Struts2+Spring4+Hibernate4三大框架整合"为学习和实践Java Web开发提供了一个实用的平台,对于提升开发者的技术水平和项目经验具有极大的帮助。通过深入研究和实践,开发者可以掌握Java ...

    struts2+spring3+hibernate4整合jar包

    这些jar包的整合使得开发者能够在同一个项目中同时使用Struts2、Spring3和Hibernate4,实现业务逻辑、数据访问和控制流程的解耦,提高代码的可维护性和可扩展性。在实际开发中,还需要配置相应的XML配置文件,如...

    springMVC4+Hibernate4整合例子

    SpringMVC4与Hibernate4是两个非常重要的Java Web开发框架,它们在企业级应用中广泛使用。SpringMVC作为Spring框架的一部分,负责处理HTTP请求,而Hibernate则是一个强大的对象关系映射(ORM)框架,用于简化数据库...

    Struts2+Spring4+Hibernate4整合

    Struts2、Spring4和Hibernate4是Java Web开发中的三个核心框架,它们分别负责MVC模式中的表现层、业务层和服务层。SSH(Struts2、Spring、Hibernate)的整合是构建高效、灵活的企业级应用的常用方式。下面将详细阐述...

    spring3.0+hibernate3.5整合那些事儿

    在IT行业中,Spring框架与Hibernate框架的整合是一个常见的任务,特别是在企业级应用开发中。本文将深入探讨"Spring 3.0 + Hibernate 3.5整合那些事儿",结合给出的标签"源码"和"工具",我们将讨论如何将这两个强大...

    Spring MVC4+Hibernate4整合

    - **创建DAO层**:Spring MVC和Hibernate整合时,通常会创建一个通用的DAO接口,如`BaseDao`,并为每个数据库实体类创建对应的DAO实现类,如`UserDaoImpl`,利用Hibernate的Session进行数据库操作。 - **事务管理*...

    struts-2.3、spring2.5.6、hibernate3.3整合示例

    Spring与Hibernate的整合可以使用`LocalSessionFactoryBean`来创建SessionFactory。 5. **整合工作**:在Struts 2的Action类中,通过Spring的代理访问业务层方法。在业务层,使用Hibernate的Session进行数据库操作...

    struts2+spring2.5+hibernate3.2整合完整项目,带数据库脚本

    Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...

    Spring3Hibernate4整合jar包

    具体到这个"Spring3.2.3 Hibernate4.2.1整合jar包",它很可能包含了一系列必要的库文件,如 Spring 的核心模块、AOP 模块、ORM 模块,以及 Hibernate 的主库、JPA 支持库等。这些 jar 包可以直接导入到项目中,帮助...

    spring3和hibernate4整合的lib库

    将Spring3与Hibernate4整合,主要是通过Spring的声明式事务管理和数据源配置,实现对Hibernate的透明管理。以下是一些整合的关键步骤: 1. **配置数据源**:在Spring配置文件中定义数据源,可以使用Apache DBCP或C3...

    springMVC+Spring3+hibernate4整合实现增删改查demo

    在"springMVC+Spring3+hibernate4整合实现增删改查demo"中,这三者协同工作,提供了一套完整的解决方案。SpringMVC接收用户请求,Spring管理Bean并处理事务,Hibernate执行数据库操作。测试类用于验证这些功能是否...

    springmvc+spring3+hibernate4框架整合完整版

    4. **整合Spring和Hibernate**: 使用Spring的`HibernateTransactionManager`处理事务,通过`SessionFactory`创建`Session`。 5. **使用DAO模式**: 创建DAO(数据访问对象)接口和实现,通过`Session`进行数据库操作...

    Spring2.5+Hibernate3整合

    5. **Spring JDBC 模块与 Hibernate 结合**:Spring 可以管理 Hibernate Session,提供事务封装,使得在 Spring 的环境下使用 Hibernate 更加简便。 6. **Hibernate Interceptor**:可以自定义拦截器,实现对 ...

    Spring+hibernate整合源代码

    这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...

    spring mvc + spring + hibernate 全注解整合开发视频教程 12

    在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第12部分,将帮助开发者掌握如何在Java Web项目中高效地集成这三个核心框架,实现松耦合、可...

Global site tag (gtag.js) - Google Analytics