假设我有一个模型 Person
.我的域正在使用 GORM 触发器,例如:
def afterInsert() {
someService.someMethod(this.id)
}
def afterUpdate() {
someService.someMethod(this.id)
}
SomeService
然后看起来像这样:def someMethod(id) {
// This query returns stale object
def person = Person.findById(id)
}
每当
someMethod()
在 SomeService
被调用时,查询不会返回更新的对象。相反,它获取旧版本/数据。我的假设是到
afterUpdate()
被调用时,更改尚未持久化到数据库。我也试过person.refresh()
,但显然它遇到了同样的问题。我也试过
.save(flush:true)
在保存对象的原始服务中,但它仍然在 gorm 触发器方法中返回旧数据。无论如何,我是否可以查询
Person
对象以使其获得最新的方式?我对如何实现这一点感到有些困惑。
最佳答案
如果可能,请避免来自 gorm Hook 的数据库交互,因为当您的应用程序增长时您会遇到问题,并且您最终会调试很多 StaleObject 或 OptimisticLocking -异常或其他奇怪的行为,就像您现在看到的那样。
如果可能,最好在此处更改底层设计,例如,如果您需要其他逻辑,则让服务在此处作为实体持久性工作。也许你可以在这里使用一些事件驱动的机制,比如 activemq。
将服务注入(inject)到域类是违反设计的,出于性能原因,在 grails 3.x 中默认阻止。如果可能,应始终避免。如果您继续像这样将事件记录推到边缘,事件记录会给您带来问题。
关于Grails:是否可以从 afterInsert() 或 afterUpdate() 查询更新后的保存对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52265475/