说我有一个模型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
对象?
我对如何实现这一点感到困惑。
答案 0 :(得分:0)
如果可能,请避免通过gorm钩进行数据库交互,因为当应用增长时,您将遇到问题,并且最终会调试许多StaleObject或OptimisticLocking -exceptions或类似您现在看到的其他奇怪行为。
如果可能的话,最好在此处更改基础设计,例如,如果需要其他逻辑,则可以在这里将服务用作实体持久程序。也许您可以在这里使用一些事件驱动机制,例如activemq。
将服务注入域类违反了设计,并且出于性能原因,默认情况下在grails 3.x中将其阻止。如果可能,应始终避免使用。如果您不断将活动记录推向边缘,则会导致问题。