gpt4 book ai didi

hibernate - 有没有办法在不从数据库刷新的情况下刷新hibernate/grails中的实体值

转载 作者:行者123 更新时间:2023-12-02 14:13:55 24 4
gpt4 key购买 nike

(我将在示例中使用 Groovy/Grails 语法)

在 hibernate 状态下,当一个实体被加载时,它们被保存在 session 缓存/L1 中,问题是如果在 session 之外发生变化,它们不会被引用,即使我通过 GORM 方法重新查询它们。这就是我使用 refresh() 的原因。

(以下所有操作都在一个 session 中完成。)

User.withNewTransaction {
User user = User.findById(1L, [lock: true]) //select for update
user.name='new name'
user.save()
}

//user entity gets updated on a different thread.

User.withNewTransaction {
user = User.findById(1L, [lock: true]) //another select for update
//at this point, the user entity is not yet filled in with the updated values from the different thread
//so I'm forced to do a refresh so that the user will have the correct values
user.refresh()
//update user
}

有替代方案吗?

这意味着我必须查询两次以确保我们在第二次交易中获得正确的值。

最佳答案

是的。

只需删除 refresh :

User.withNewTransaction {
user = User.findById(1L) //user = User.findById(1L, [lock: true]) //another select for update
//at this point, the user entity is not yet filled in with the updated values from the different thread
//so I'm forced to do a refresh so that the user will have the correct values
//user.refresh()
//update user
}

更好的解决办法是放弃交易!因为事务用于批处理操作:

user = User.findById(1L)

如果您希望保留交易语法,那么使用 withTransaction 将其加入其他正在进行的交易会更有意义:

User.withTransaction {
user = User.findById(1L) //user = User.findById(1L, [lock: true]) //another select for update
//at this point, the user entity is not yet filled in with the updated values from the different thread
//so I'm forced to do a refresh so that the user will have the correct values
//user.refresh()
//update user
}

夏季:

你应该很少使用 refresh,因为它忽略了 hibernate 的优点,除非有特殊需要指定 here

关于hibernate - 有没有办法在不从数据库刷新的情况下刷新hibernate/grails中的实体值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38838606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com