如果包含在withNewSession中,grails会创建标准非唯一对象错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果包含在withNewSession中,grails会创建标准非唯一对象错误相关的知识,希望对你有一定的参考价值。

我的标准看起来像这样

  //Inventory.withNewSession{
    Set inventory=Inventory.withCriteria{
       setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
       inventoryDetail{
           eq('userAdded',true)
       }
       ...
     }
//}

如果我将它包装在withNewSession中,我会在会话错误中获得重复键和非唯一对象。如果我不使用withNewSession,它可以工作。

为什么?

答案

如果您已经有一个会话并使用id=1(例如)加载了对象,然后创建了一个新会话并加载了同一个对象。当新会话块结束时,hibernate会话加入现有会话(我说这是对的吗?)现在你用两个对象加载了相同的ID。

我不确定你为什么在这里使用withNewSession,是否有一条路径可以在没有休眠会话的情况下执行?正如TDC建议的那样,您是否正在尝试将此事务隔离开来?

另一答案

也许尝试使用withTransaction替换newNewSession?

Inventory.withTransaction{
    Set inventory=Inventory.withCriteria{
       setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
       inventoryDetail{
           eq('userAdded',true)
       }
     }
}

以上是关于如果包含在withNewSession中,grails会创建标准非唯一对象错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用hibernate grails 3,mysql?

在 Grails 中存储和编辑键/值对?

Grails 中的自定义验证器中的异常

关于grails连接数据库

GORM数据服务VS Grails服务

saltstack 数据系统之 grains 简单学习