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

标签 grails grails-orm

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

相关文章:

grails - Grails 3.3.2扩展 “NavigableMapConfig”并覆盖 “get”方法

java - 如何管理功能测试的应用程序数据?

javascript - Grails 项目中的 js 文件。问题

unit-testing - 覆盖 Grails GORM 域类上的事件关闭以进行单元测试

Grails DetachedCriteria 不包含 sqlRestriction

Grails3.04,什么是 "f:table"?

ruby-on-rails-3 - 如何开发允许用户向文本文件添加标记的Webapp?

mysql - GORM withCriteria 返回意外的重复结果

postgresql - 针对内存中的 h2 数据源运行 Jasper Reports?

Grails 2抽象域继承问题