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

问题描述 投票:0回答:2

我的标准看起来像这样

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

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

为什么?

hibernate grails gorm
2个回答
1
投票

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

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


0
投票

也许尝试使用withTransaction替换newNewSession?

Inventory.withTransaction{
    Set inventory=Inventory.withCriteria{
       setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
       inventoryDetail{
           eq('userAdded',true)
       }
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.