gpt4 book ai didi

grails - 无法在grails中实现软删除

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

我正在尝试找到对我的实体数量实施软删除的正确方法。
到目前为止,我发现的最好方法是使用beforeDelete()回调。

所以我的课看起来像这样:

class Goal {

String definition;
Account account;
boolean tmpl = false;
String tmplName;

Timestamp dateCreated
Timestamp lastUpdated
Timestamp deletedAt
...
def beforeDelete() {
if (deletedAt == null) {
deletedAt = new Timestamp(System.currentTimeMillis())
this.save()
}

return false
}
}

在我的情况下,删除是通过事务服务类执行的,如下所示:
def deleteTemplate(Goal tmpl) {
if (tmpl.tmpl != true) {
throw new ValidationException("Provided object is not template!")
}

//delete related perceptions
for (perception in tmpl.perceptions) {
perception.delete()
}

tmpl.delete()
}

我得到的只是一个错误:
    Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [triz.rrm.Perception#3]. Stacktrace follows:
Message: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [triz.rrm.Perception#3]
Line | Method
->> 63 | beforeDelete in triz.rrm.Goal
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 153 | call in org.grails.datastore.gorm.support.EventTriggerCaller$MethodCaller
| 96 | call . . . . . . . in org.grails.datastore.gorm.support.EventTriggerCaller
| 47 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
| 138 | deleteTmpl . . . . in triz.rrm.RrmTemplateController
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter
| 53 | doFilter in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
| 49 | doFilter . . . . . in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
| 82 | doFilter in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 1142 | runWorker . . . . in java.util.concurrent.ThreadPoolExecutor
| 617 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . . . . . in java.lang.Thread

我已经尝试了一切,包括用新的 session 和新的事务包装它,没有任何帮助。我想念什么?

感谢您的意见。
亚历克斯

附言如果我将服务标记为NotTransactional,则没有错误,但没有任何更新。

最佳答案

我不知道这是否有帮助,但是也许您可以尝试在beforeDelete()中使用hql:

def beforeDelete() {
if (deletedAt == null) {
Goal.executeUpdate('update Goal set deletedAt = ? where id = ?', [new Timestamp(System.currentTimeMillis()), id])
}

return false
}

我曾经尝试解决类似的问题,问题是,当您确实更新自己的方式时,它不会立即完成,而是进入休眠的 session ,并保持刷新状态,同时可能发生此类异常关于访问对象。 Hql立即保存

关于grails - 无法在grails中实现软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29116139/

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