Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Spring在nhibernate事务后不关闭会话_C#_Asp.net Mvc_Nhibernate_Fluent Nhibernate_Spring.net - Fatal编程技术网

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方法获取帐户
  • 改变一些属性
  • 调用管理器的更新方法更新此帐户
管理器的每个功能都由AOP封装到事务中。 当我调用Update方法时,它会写入错误。看起来这是因为Account对象仍然附加到为Get函数打开的会话。 我试图直接在Get函数中打开和关闭会话(没有AOP)。在那种情况下,一切正常

所以问题是,为什么帐户对象在Get调用后仍然附加到会话

如果您没有为Repo使用接口,那么spring无法构建AOP装饰器


我正在为manager使用接口。我测试了事务的回滚。它是有效的,所以我认为AOP装饰器是构建的。

从对您的问题的评论中,我了解到您的AOP代理配置正确。我知道你们有这样一个经理班:

公共类管理器:代理
{
对象获取(…){}
无效更新(对象更新){}
}
此manager类由您的问题中的事务拦截器通知。 此管理器被注入到控制器中,控制器首先调用
Get()
(启动并完成第一个事务),然后调用
Update(…)
。重要的是要认识到,
Update(…)
上的调用会启动第二个事务,当会话范围不是“每个请求”时,这可能会导致您提到的错误。如果未找到会话,则每个事务将创建新会话

有几种解决方案:

  • 确保您的会话在整个web请求期间保持打开状态,例如,在视图中使用open session,如中所示
  • 从包装在事务通知中的另一个方法中调用
    Get(…)
    Update(…)
    例程,以便在方法调用之间传播事务

  • 是否从同一对象中调用这些方法?您的nh会话范围是如何配置的?你能把代码贴在你调用
    Get
    Update
    的地方吗?还有
    Get
    Update
    的实现。我想你们并没有为你们的Repo使用接口,而spring并没有构建AOP装饰器。我将尝试更精确地描述这个问题。我有mvc项目。控制者呼叫经理(他们代表业务逻辑)。管理者使用存储库(DAO)与数据库交互。在更新操作中,我做了以下事情:-调用管理器的Get方法获取帐户-更改一些属性-调用管理器的update方法更新此帐户。管理器的每个功能都由AOP封装到事务中。当我调用Update方法时,上面描述的错误似乎是因为Account对象仍然附加到为Get函数打开的会话。我试图直接在Get函数中打开和关闭会话(没有AOP)。在那种情况下,一切正常。所以问题是,为什么帐户对象在Get调用后仍然附加到会话?