-
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>
DAOpackage 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个答案 按时间排序 按投票排序
-
采纳的答案
在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
-
方法有点问题
public Session getSession() {
Session session = null;
try {
session = sessionFactory.getCurrentSession();
} catch (HibernateException he) {
session = sessionFactory.openSession();
}
return session;
}2016年8月17日 10:50
-
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
-
<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
-
你加入了 注解的扫描了吗?
<!-- 启动注解扫描 -->
<context:component-scan base-package="com"/>
2014年5月14日 16:57
-
<property name="packagesToScan" value="com.foo.model" /> 是否是这里配置错误?
2014年5月14日 15:36
相关推荐
Struts2、Spring3和Hibernate4是Java Web开发中的三大框架,它们的整合极大地提高了开发效率,简化了项目结构,并提供了强大的功能。SSH(Struts2、Spring、Hibernate)是企业级应用开发的常见选择,这主要是因为...
Spring 和 Hibernate 的整合是企业级 Java 应用开发中的常见实践,它将 Spring 框架的控制反转(IoC)和面向切面编程(AOP)优势与 Hibernate 的持久化能力相结合,提供了更高效、灵活的数据库操作。下面我们将深入...
**Spring3整合Hibernate4测试Demo** 在Java Web开发中,Spring和Hibernate是两个非常重要的框架。Spring是一个全面的后端应用程序框架,它提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及其他...
Spring MVC、Spring 3 和 Hibernate 4 是三个在Java Web开发中非常重要的框架,它们的整合使得开发者可以构建高效、可维护的业务应用程序。在这个基于SSH的CURD(创建、读取、更新、删除)项目中,我们将深入探讨这...
3. **数据访问对象(DAO)**:Spring的DAO支持包括定义DAO接口和实现类,以及使用HibernateTemplate或HibernateDaoSupport作为基础类,简化与Hibernate Session的交互。 4. **实体管理**:在Hibernate中,实体类是...
总的来说,"最新项目系统:Struts2+Spring4+Hibernate4三大框架整合"为学习和实践Java Web开发提供了一个实用的平台,对于提升开发者的技术水平和项目经验具有极大的帮助。通过深入研究和实践,开发者可以掌握Java ...
这些jar包的整合使得开发者能够在同一个项目中同时使用Struts2、Spring3和Hibernate4,实现业务逻辑、数据访问和控制流程的解耦,提高代码的可维护性和可扩展性。在实际开发中,还需要配置相应的XML配置文件,如...
SpringMVC4与Hibernate4是两个非常重要的Java Web开发框架,它们在企业级应用中广泛使用。SpringMVC作为Spring框架的一部分,负责处理HTTP请求,而Hibernate则是一个强大的对象关系映射(ORM)框架,用于简化数据库...
Struts2、Spring4和Hibernate4是Java Web开发中的三个核心框架,它们分别负责MVC模式中的表现层、业务层和服务层。SSH(Struts2、Spring、Hibernate)的整合是构建高效、灵活的企业级应用的常用方式。下面将详细阐述...
在IT行业中,Spring框架与Hibernate框架的整合是一个常见的任务,特别是在企业级应用开发中。本文将深入探讨"Spring 3.0 + Hibernate 3.5整合那些事儿",结合给出的标签"源码"和"工具",我们将讨论如何将这两个强大...
- **创建DAO层**:Spring MVC和Hibernate整合时,通常会创建一个通用的DAO接口,如`BaseDao`,并为每个数据库实体类创建对应的DAO实现类,如`UserDaoImpl`,利用Hibernate的Session进行数据库操作。 - **事务管理*...
Spring与Hibernate的整合可以使用`LocalSessionFactoryBean`来创建SessionFactory。 5. **整合工作**:在Struts 2的Action类中,通过Spring的代理访问业务层方法。在业务层,使用Hibernate的Session进行数据库操作...
Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...
具体到这个"Spring3.2.3 Hibernate4.2.1整合jar包",它很可能包含了一系列必要的库文件,如 Spring 的核心模块、AOP 模块、ORM 模块,以及 Hibernate 的主库、JPA 支持库等。这些 jar 包可以直接导入到项目中,帮助...
将Spring3与Hibernate4整合,主要是通过Spring的声明式事务管理和数据源配置,实现对Hibernate的透明管理。以下是一些整合的关键步骤: 1. **配置数据源**:在Spring配置文件中定义数据源,可以使用Apache DBCP或C3...
在"springMVC+Spring3+hibernate4整合实现增删改查demo"中,这三者协同工作,提供了一套完整的解决方案。SpringMVC接收用户请求,Spring管理Bean并处理事务,Hibernate执行数据库操作。测试类用于验证这些功能是否...
4. **整合Spring和Hibernate**: 使用Spring的`HibernateTransactionManager`处理事务,通过`SessionFactory`创建`Session`。 5. **使用DAO模式**: 创建DAO(数据访问对象)接口和实现,通过`Session`进行数据库操作...
5. **Spring JDBC 模块与 Hibernate 结合**:Spring 可以管理 Hibernate Session,提供事务封装,使得在 Spring 的环境下使用 Hibernate 更加简便。 6. **Hibernate Interceptor**:可以自定义拦截器,实现对 ...
这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...
在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第12部分,将帮助开发者掌握如何在Java Web项目中高效地集成这三个核心框架,实现松耦合、可...