【问题标题】:Why Spring doesn't intercept transaction?为什么 Spring 不拦截事务?
【发布时间】:2012-01-24 16:44:19
【问题描述】:

尝试为带有休眠和事务的测试配置 Spring。从带有@Transactional 事务标记的应用程序上下文中获取bean 不会被拦截。我在配置中可能会错过什么?

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    <property name="dataSource" ref="dataSource"></property>
</bean>

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

<import resource="spring-dao.xml"/>

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


<bean id="userService" class="com.test.service.UserServiceimpl">
    <property name="userDao" ref="userDao"/>
</bean>

public interface UserService {

public abstract User loadUserById(long userId);

@Transactional
public abstract void doSomething();

}

public class UserServiceimpl implements UserService {
@Override
public void doSomething() {
    User user = loadUserById(1);
    user.fillUpMoney(999);
    userDao.update(user);
    throw new RuntimeException("Shpould be rollback");
}

【问题讨论】:

  • 不确定这是否是异常的原因,但是Spring建议将@Transactional放在实现方法上,而不是在接口方法上。
  • 相关:stackoverflow.com/q/4745798/342852(类不从其接口继承注释)
  • 我记得它依赖于代理实现。无论如何注释类方法spring不会拦截事务...

标签: spring transactions spring-transactions


【解决方案1】:

不要将抽象方法注释为事务性的,注释具体实现。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2018-08-09
    • 2015-11-18
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多