2013-01-25 37 views
2

有关于这个在这么可怕的很多问题,但我已经尝试了一些他们的声音正确的,但我仍然得到为什么Spring的事务管理不能使用这个配置?

org.hibernate.HibernateException: No Session found for current thread 

我的服务层类这样的注释:

@Service 
    public class MyService { 
     @Autowired 
     public SomeDao someDao; 

     @Transactional 
     public void performSomeTransaction() {/* ... */} 
    } 

我的应用程序上下文XML具有以下相关声明:

<context:component-scan base-package = "com.myapp.business.dao.impl" /> 
    <context:component-scan base-package = "com.myapp.business.services" /> 

    <context:annotation-config /> 

    <tx:annotation-driven transaction-manager = "transactionManager" /> 

    <!-- Hibernate --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="connection.url">jdbc:mysql://localhost:3306/bidapp</prop> 
       <prop key="connection.username">bidapp</prop> 
       <prop key="connection.password">pennyfss</prop> 
       <prop key="connection.driver_class">com.mysql.jdbc.Driver</prop> 

       <prop key="hibernate.connection.pool_size">10</prop> 
       <prop key="hibernate.connection.autocommit">false</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 

       <prop key="c3p0.acquireIncrement">1</prop> 
       <prop key="c3p0.max_size">50</prop> 
       <prop key="c3p0.max_statement">0</prop> 
       <prop key="c3p0.min_size">10</prop> 
       <prop key="c3p0.timeout">0</prop> 
      </props> 
     </property> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.bidapp.business.domain</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/bidapp" /> 
     <property name="username" value="bidapp" /> 
     <property name="password" value="pennyfss" /> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

我也有我的dispatcher-servlet.xml文件与

<mvc:annotation-driven /> 
<mvc:default-servlet-handler /> 

<context:component-scan base-package="com.myapp.presentation.controllers" /> 
<context:annotation-config /> 

<bean id="viewResolver" class="org.thymeleaf.spring3.view.ThymeleafViewResolver"> 
    <property name="templateEngine" ref="templateEngine" /> 
</bean> 

为什么春季不包裹我的服务与交易?

所以看来这个问题与没有正确获取实例有关。我有以下四郎安全配置:

<bean id = "hibernateRealm" class = "com.bidapp.presentation.shiro.HibernateRealm" > 
     <property name = "credentialsMatcher" ref = "credentialsMatcher" /> 
    </bean> 

    <bean id = "credentialsMatcher" class = "com.bidapp.presentation.shiro.JasyptCredentialsMatcher" /> 

    <bean id = "securityManager" class = "org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
     <property name = "realm" ref = "hibernateRealm" /> 
    </bean> 

HibernateRealm与@Transactional注释的服务类。 Spring不应该在代理中包装它,因为它在这里创建它。

回答

1

这个问题的最常见的原因是

  1. 错误地获得服务实例:例如,将其实例化自己,而不是从春天得到一个实例。
  2. 在Spring MVC应用程序中错误地配置根和子应用程序上下文。我在这里回答了很多这样的问题。下面是一些更多的教育者的:

Spring XML file configuration hierarchy help/explanation

Declaring Spring Bean in Parent Context vs Child Context

显示在您获取和使用服务实例将有助于确定该问题的代码。

+0

我很确定它与1有关。我正在使用shiro安全并声明一个bean服务来引用其中一个安全管理器。有没有解决这个问题的方法? –

+0

我正在向我的Realm类注入一个DAO。指针之后,我自动装配了一个调用DAO的Service类。它使用事务性注释,所以我获得了额外跳跃的代价相同的行为。没什么大不了的。有用。 –

0

在会话工厂创建期间在hibernate-persistance.xml文件中添加hibernate.current_session_context_class = thread属性,它将起作用。

+0

你可以添加一些关于为什么这项工作的更多信息,并可能在上下文中添加示例吗? –

相关问题