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

问题描述 投票:0回答:1

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

grails gorm
1个回答
0
投票

如果可能的话,避免数据库交互来自gorm钩子,因为当你的应用程序增长时你会遇到问题并且你最终会调试很多StaleObject或OptimisticLocking -exceptions或者你现在看到的其他奇怪的行为。

如果可能的话,最好在这里更改底层设计,例如,如果您需要额外的逻辑,请将服务作为实体持久化。也许你可以在这里使用像activemq这样的事件驱动机制。

向域类注入服务违反了设计,出于性能原因,默认情况下会在grails 3.x中进行阻止。应尽可能始终避免。如果你继续将它推到这样的边缘,活动记录会给你带来问题。

© www.soinside.com 2019 - 2024. All rights reserved.