gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:43:58 24 4
gpt4 key购买 nike

假设我有一个模型 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com