Grails:是否可以从afterInsert()或afterUpdate()查询更新的保存对象?

时间:2018-09-10 21:06:04

标签: grails gorm

说我有一个模型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对象?
我对如何实现这一点感到困惑。

1 个答案:

答案 0 :(得分:0)

如果可能,请避免通过gorm钩进行数据库交互,因为当应用增长时,您将遇到问题,并且最终会调试许多StaleObject或OptimisticLocking -exceptions或类似您现在看到的其他奇怪行为。

如果可能的话,最好在此处更改基础设计,例如,如果需要其他逻辑,则可以在这里将服务用作实体持久程序。也许您可以在这里使用一些事件驱动机制,例如activemq。

将服务注入域类违反了设计,并且出于性能原因,默认情况下在grails 3.x中将其阻止。如果可能,应始终避免使用。如果您不断将活动记录推向边缘,则会导致问题。