如果用withNewSession包装,grails创建条件非唯一对象错误

时间:2019-04-16 20:19:24

标签: hibernate grails gorm

我有类似这样的条件

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

如果将其包装在withNewSession中,则会在会话错误中得到重复的键和非唯一对象。如果我不使用withNewSession,它将起作用。

为什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

maybe try to use replace withNewSession with withTransaction?

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