Java 未找到当前线程的会话(Spring 3.1.X和Hibernate 4)

Java 未找到当前线程的会话(Spring 3.1.X和Hibernate 4),java,hibernate,spring,spring-3,hibernate-4.x,Java,Hibernate,Spring,Spring 3,Hibernate 4.x,我正在尝试使用Spring3.1和Hibernate4设置我的项目。我一直在网上学习一些教程。我得到了一个奇怪的错误,根据spring论坛的说法,spring 3.1应该已经修复了这个错误 当我的服务调用getCurrentSession()时,它抛出以下异常: org.hibernate.HibernateException: **No Session found for current thread**] with root cause org.hibernate.HibernateExce

我正在尝试使用Spring3.1和Hibernate4设置我的项目。我一直在网上学习一些教程。我得到了一个奇怪的错误,根据spring论坛的说法,spring 3.1应该已经修复了这个错误

当我的服务调用
getCurrentSession()
时,它抛出以下异常:

org.hibernate.HibernateException: **No Session found for current thread**] with root cause org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:881)
****编辑:根据spring更新了我的spring-dao.xml。我尝试用org.apache.commons.dbcp.BasicDataSource交换数据源。我的配置中是否缺少任何可能导致此问题的属性****

下面是我的spring-dao.xml:

 <!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />   

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value>
    </property>
</bean>

<!-- Declare a datasource that has pooling capabilities-->   
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
            destroy-method="close"
            p:driverClass="${app.jdbc.driverClassName}"
            p:jdbcUrl="${app.jdbc.url}"
            p:user="${app.jdbc.username}"
            p:password="${app.jdbc.password}"
            p:acquireIncrement="5"
            p:idleConnectionTestPeriod="60"
            p:maxPoolSize="100"
            p:maxStatements="50"
            p:minPoolSize="10" />

<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
            p:sessionFactory-ref="sessionFactory" />
最后我的服务

package com.foo.lystra.services;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.foo.lystra.beans.User;
import com.foo.lystra.beans.Congregation;

@Service("congregationUserService")
@Transactional
public class CongregationUserService {
protected static Log logger = LogFactory.getLog(CongregationUserService.class);

@Resource(name="sessionFactory")
private SessionFactory sessionFactory;

public List<User> getAllUsers() {
    logger.debug("getting all users");

            //Exception is thrown on this next line:
    Session session = sessionFactory.getCurrentSession();

    Query query = session.createQuery("FROM users");
    return query.list();
}
}
package com.foo.lystra.services;
导入java.util.List;
导入javax.annotation.Resource;
导入org.apache.commons.logging.LogFactory;
导入org.apache.commons.logging.Log;
导入org.hibernate.Query;
导入org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.springframework.stereotype.Service;
导入org.springframework.transaction.annotation.Transactional;
导入com.foo.lystra.beans.User;
导入com.foo.lystra.beans.Congregation;
@服务(“集合用户服务”)
@交易的
公共类聚集用户服务{
受保护的静态日志记录器=LogFactory.getLog(CongregationUserService.class);
@资源(name=“sessionFactory”)
私人会话工厂会话工厂;
公共列表getAllUsers(){
debug(“获取所有用户”);
//在下一行引发异常:
Session Session=sessionFactory.getCurrentSession();
Query Query=session.createQuery(“来自用户”);
返回query.list();
}
}

我意识到我的数据源可能没有被使用。如果我忘了包括任何配置,我可以更新这篇文章。如果需要Tomcat启动日志,我也可以提供它们。

不确定,但问题可能出在
p:packagesToScan
中。您的ConfigurationUserService位于包
com.foo.lystra.services
中,但是
p:packagesToScan
具有
com.foo.lystra.beans

您的配置没有指向带注释的类。添加它们

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
  <property name="hibernateProperties">
     <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value>
  </property>

  <property name="annotatedClasses">
    <list>
      <value>test.package.Foo</value>
      <value>test.package.Bar</value>
    </list>
  </property>
</bean>

hibernate.dialogue=org.hibernate.dialogue.mysqlinnodbdialogue
test.package.Foo
test.package.Bar

这与早些时候的情况类似。检查Api。

它是web应用程序吗?如果是,请考虑使用OpenSSIENVIEW筛选器。因为我相信当使用currentSession(绑定到当前线程)时,代码中必须有一个点将会话从线程中解除绑定

我不确定事务管理器是否会这样做

我相信您需要:

<context:component-scan base-package="com.foo.package" />


否则spring上下文将找不到您的服务,因此不会用事务方面包装您的方法。

我遇到了与您相同的错误

这是一个尚未解决的错误

尝试将HibernateJAR文件更改为3.6。因为春天用它


在这里,Spring3.1工件和依赖项在web应用程序中也有同样的问题。问题在于两个配置文件中都存在哪些文件:application-context.xml和webmvc-context.xml。webmvc-context.xml在application-context.xml之后加载。我认为,在加载application-context.xml时,DAO类首先加载事务性引用,但在加载webmvc-context.xml时,它将被另一个对象替换,而没有事务性引用。无论如何,我都可以通过扫描特定的包来解决问题:

对于application-context.xml和

对于webmvc context.xml.

,如(3.2.x)所述:

在Web MVC框架中,每个DispatcherServlet都有自己的 WebApplicationContext,它继承中已定义的所有bean 根WebApplicationContext。这些继承的bean可以是 在servlet特定的范围内重写,您可以定义新的 特定于作用域的bean位于给定Servlet实例的本地

因此,使用
定义或扫描的bean将在控制器中可见,因此您可以@Autowired它们,但在其他applicationContext*文件中不可见,因此除非在DispatcherServlet的配置中未定义
,否则@Transactional将无法工作


因此,我猜您的DispatcherServlet配置中可能有一个
,而应用程序context*.xml中有一个
声明,因此@Autowired可以正常工作,但@Transactional不行

有完全相同的错误,只需为我的服务创建一个接口即可解决。因此,在您的情况下,我将创建:

public interface ICongregationUserService {
   public List<User> getAllUsers();
}
而在您自动连线的CollectionUserService中,则改为autowire ICongregationUserService:

@Autowired
private ICongregationUserService congregationUserService;

我有同样的问题,并测试了所有回答的解决方案。瓦利的回答很有帮助。对我有效的方法是将这些bean从applicationContext.xml移动到web-servlet.xml:

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>       
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven />
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xsi:schemaLocation="       
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    "

我通过将
放入dispatcher-servlet.xml而不是任何其他xml配置文件来解决这个问题


我认为这种方式允许bean在相同的spring上下文中共存。

在web.xml中添加OpenSessionInViewFilter过滤器

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

冬眠过滤器
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
sessionFactoryBeanName
会话工厂
冬眠过滤器
/*
要求
向前地

我发现这个问题是spring的一个bug

此链接报告问题

为了解决这个问题,我使用了Matias Mirabelli的变通方法,可以在这个链接上找到

正在发生的是,使用
传播进行注释的方法支持事务,但如果没有事务绑定到线程,则spring会抛出一个
HibernateeException

为了配置sol
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xsi:schemaLocation="       
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    "
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
<mvc:annotation-driven />
<context:component-scan base-package="ru.dd.demo" />
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.sprhib.repo"/>  #(some class files are annotaed by @Repository,@Service,@Component)
<tx:annotation-driven transaction-manager="txManager" />
<task:annotation-driven/>
<context:component-scan base-package="com.sprhib.web"/>  #(some class files are annotaed by @Controller)
<mvc:annotation-driven />