C# Spring在nhibernate事务后不关闭会话
我有以下声明代码:C# Spring在nhibernate事务后不关闭会话,c#,asp.net-mvc,nhibernate,fluent-nhibernate,spring.net,C#,Asp.net Mvc,Nhibernate,Fluent Nhibernate,Spring.net,我有以下声明代码: 我从函数“X”调用方法“Get”和“Update” 方法“Update”引发异常“具有相同标识符值的不同对象已与会话关联” 执行方法之后如何在Spring期间关闭会话 更新信息: 我将尝试更精确地描述这个问题 我有mvc项目。控制者呼叫经理(他们代表业务逻辑)。管理者使用存储库与数据库进行交互。 在更新操作中,我执行以下操作: 调用经理的Get方法获取帐户 改变一些属性 调用管理器的更新方法更新此帐户 管理器的每个功能都由AOP封装到事务中。 当我调用Update方法
我从函数“X”调用方法“Get”和“Update”
方法“Update”引发异常“具有相同标识符值的不同对象已与会话关联”
执行方法之后如何在Spring期间关闭会话
更新信息:
我将尝试更精确地描述这个问题 我有mvc项目。控制者呼叫经理(他们代表业务逻辑)。管理者使用存储库与数据库进行交互。 在更新操作中,我执行以下操作:
- 调用经理的Get方法获取帐户
- 改变一些属性
- 调用管理器的更新方法更新此帐户
我正在为manager使用接口。我测试了事务的回滚。它是有效的,所以我认为AOP装饰器是构建的。从对您的问题的评论中,我了解到您的AOP代理配置正确。我知道你们有这样一个经理班:
公共类管理器:代理
{
对象获取(…){}
无效更新(对象更新){}
}
此manager类由您的问题中的事务拦截器通知。
此管理器被注入到控制器中,控制器首先调用Get()
(启动并完成第一个事务),然后调用Update(…)
。重要的是要认识到,Update(…)
上的调用会启动第二个事务,当会话范围不是“每个请求”时,这可能会导致您提到的错误。如果未找到会话,则每个事务将创建新会话
有几种解决方案:
Get(…)
和Update(…)
例程,以便在方法调用之间传播事务是否从同一对象中调用这些方法?您的nh会话范围是如何配置的?你能把代码贴在你调用
Get
和Update
的地方吗?还有Get
和Update
的实现。我想你们并没有为你们的Repo使用接口,而spring并没有构建AOP装饰器。我将尝试更精确地描述这个问题。我有mvc项目。控制者呼叫经理(他们代表业务逻辑)。管理者使用存储库(DAO)与数据库交互。在更新操作中,我做了以下事情:-调用管理器的Get方法获取帐户-更改一些属性-调用管理器的update方法更新此帐户。管理器的每个功能都由AOP封装到事务中。当我调用Update方法时,上面描述的错误似乎是因为Account对象仍然附加到为Get函数打开的会话。我试图直接在Get函数中打开和关闭会话(没有AOP)。在那种情况下,一切正常。所以问题是,为什么帐户对象在Get调用后仍然附加到会话?