gpt4 book ai didi

java - 为什么 Spring 的事务管理不适用于此配置?

转载 作者:行者123 更新时间:2023-11-30 11:36:30 25 4
gpt4 key购买 nike

SO 上有很多关于此的问题,但我已经尝试了其中一些听起来正确的问题,但我仍然得到

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>

为什么 spring 不使用事务来包装我的服务?

因此看来问题与未正确获取实例有关。我有以下 Shiro 安全配置:

    <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. 错误地获取服务实例:例如,自己实例化它而不是从 Spring 获取实例。
  2. 在 Spring MVC 应用程序中错误地配置了根和子应用程序上下文。我已经在这里回答了很多这样的问题。以下是一些更具教育意义的内容:

Spring XML file configuration hierarchy help/explanation

Declaring Spring Bean in Parent Context vs Child Context

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

关于java - 为什么 Spring 的事务管理不适用于此配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14514818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com