@Transactional注释不代理我的班级

时间:2016-03-23 16:37:00

标签: java spring hibernate transactions

我有3个类,AccountController,AccountManager和AccountDao(它们按顺序相互注入,即controller< - manager< - dao)。当我在accountDao上放一个@Transactional注释时,我有一个数据库会话,一切正常。当我把@Transactional放在经理上时,它不起作用。我明白了:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

我发现由于某种原因(调试时),accountManager不是代理包装器。任何想法为什么会这样?

在我的应用程序上下文的XML中我有:

<context:component-scan base-package="com.mypackage" use-default-filters="true">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<tx:annotation-driven transaction-manager="hibernateTransactionManager" proxy-target-class="true"/>

在AccountManager上,我添加了以下注释:

@Repository
@Transactional
public class AccountManager  { ... }

甚至更奇怪的是,AccountManager注入了一个“DeviceManager”,其注释与AccountManager相同,但DeviceManager确实得到了代理!这完全是交易性的。

我正在使用org.springframework.transaction.annotation.Transactional注释。

我在AccountManager中没有任何最终方法

1 个答案:

答案 0 :(得分:1)

我认为你需要JTA @Transactional注释。在您的Repository类AccountManager中使用javax.transaction.Transactional而不是Hibernate的org.springframework.transaction.annotation.Transactional

请参阅Spring的文档Spring Transactional Annotation