说我有一个模型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()
时,这些更改尚未持久保存到DB。我也试过person.refresh()
,但显然它遇到了同样的问题。
我也在原始服务中尝试了.save(flush:true)
,其中对象被保存,但它仍然在gorm触发器方法中的旧数据中返回。
那么无论如何我要以这样的方式查询Person
对象以获得最新的?
我对如何实现这一点感到有点困惑。
如果可能的话,避免数据库交互来自gorm钩子,因为当你的应用程序增长时你会遇到问题并且你最终会调试很多StaleObject或OptimisticLocking -exceptions或者你现在看到的其他奇怪的行为。
如果可能的话,最好在这里更改底层设计,例如,如果您需要额外的逻辑,请将服务作为实体持久化。也许你可以在这里使用像activemq这样的事件驱动机制。
向域类注入服务违反了设计,出于性能原因,默认情况下会在grails 3.x中进行阻止。应尽可能始终避免。如果你继续将它推到这样的边缘,活动记录会给你带来问题。