我有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中没有任何最终方法
答案 0 :(得分:1)
我认为你需要JTA @Transactional
注释。在您的Repository类AccountManager中使用javax.transaction.Transactional
而不是Hibernate的org.springframework.transaction.annotation.Transactional
。
请参阅Spring的文档Spring Transactional Annotation