gpt4 book ai didi

java - @Transactional 注释不代理我的类

转载 作者:行者123 更新时间:2023-12-01 10:09:59 25 4
gpt4 key购买 nike

我有 3 个类,AccountController、AccountManager 和 AccountDao(它们按该顺序相互注入(inject),即 Controller <- manager <- dao)。当我在 accountDao 上添加 @Transactional 注释时,我有一个数据库 session ,并且一切正常。当我将 @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 中注入(inject)了一个“DeviceManager”,其注释与 AccountManager 相同,但 DeviceManager 确实被代理了!它是完全事务性的。

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

我在 AccountManager 中没有任何 final方法

最佳答案

编辑以回应@Enigo的回答:

  1. AccountManager 不是存储库,因此应使用 @Service 注释,并且 AccountDao 应使用 @Repository 注释
  2. AccountManager 应实现一个接口(interface),并且该接口(interface)应注入(inject)到 Controller 类中
  3. 确保您在 AccountManager 中调用的方法是公共(public)的,并覆盖接口(interface)中的方法声明

关于java - @Transactional 注释不代理我的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183824/

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