gpt4 book ai didi

c# - Spring 在 nhibernate 事务后不关闭 session

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:15 24 4
gpt4 key购买 nike

我有以下声明代码:

<tx:advice id="txAdvice" transaction-manager="TransactionManager">
<tx:attributes>
<tx:method name="Get"/>
<tx:method name="Update"/>
</tx:attributes>
</tx:advice>

我从函数“X”调用方法“Get”和“Update”。

方法“更新”抛出异常“具有相同标识符值的不同对象已与 session 相关联”

如何在执行方法后在 Spring 期间关闭 session ?

更新信息:

我会尝试更准确地描述问题。

我有 mvc 项目。 Controller 调用管理器(它们代表业务逻辑)。经理使用存储库与数据库进行交互。在更新操作中,我做了以下事情:

  • 调用manager的Get方法获取Account
  • 改变一些属性
  • 调用管理器的 Update 方法来更新此帐户。

管理器的每个功能都被AOP包装成事务。当我调用 Update 方法时,它会写入错误。看起来这是因为 Account 对象仍然附加到为 Get 函数打开的 session 。我尝试直接在 Get 函数中打开和关闭 session (没有 AOP)。在这种情况下,所有工作都是正确的。

所以问题是为什么 Account 对象在 Get 调用后仍然附加到 session 中?

Imho you are not using Interfaces for your Repo and spring fails to build the AOP decorator.

我正在使用管理器界面。我测试了事务的回滚。它有效,所以我认为 AOP 装饰器已构建。

最佳答案

根据对您问题的评论,我了解到您的 AOP 代理已正确配置。我知道你有一个这样的经理类:

public class Manager : ISomeInterfaceToProxy
{
object Get(...) {}
void Update(object toUpdate) {}
}

这个管理器类被建议使用您问题中的事务拦截器。该管理器被注入(inject)到您的 Controller 中,它首先调用 Get()(启动并完成第一个事务),然后调用 Update(...)。重要的是要意识到对 Update(...) 的调用会启动第二个事务,当 session 范围不是“per”时,这可能会导致您提到的错误要求”。如果没有找到 session ,则每个事务都会创建新 session 。

有几种解决方法:

  1. 确保您的 session 在整个网络请求期间保持打开状态,例如在 View 中使用开放 session spring.net nhibernate session/transaction per request
  2. 从包含在事务建议中的另一个方法中调用 Get(...)Update(...) 例程,这样事务就在方法调用之间传播

关于c# - Spring 在 nhibernate 事务后不关闭 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583816/

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