首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在grails中执行软删除时出错

在grails中执行软删除时出错
EN

Stack Overflow用户
提问于 2015-03-18 07:17:23
回答 1查看 488关注 0票数 1

我试图找到适当的方式来实现对我的实体数量的软删除。到目前为止,我发现最好的方法是使用beforeDelete()回调。

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

代码语言:javascript
运行
复制
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
    }
}

在我的示例中,删除是通过事务性服务类执行的,如下所示:

代码语言:javascript
运行
复制
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()
}

我所得到的只是一个错误:

代码语言:javascript
运行
复制
    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

我已经尝试了一切,包括用新会话和新事务包装它,没有任何帮助。我遗漏了什么?

谢谢你的建议。亚历克斯。

如果我将服务标记为NotTransactional,没有错误,但是没有更新。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-18 07:39:46

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

代码语言:javascript
运行
复制
def beforeDelete() {
    if (deletedAt == null) {
        Goal.executeUpdate('update Goal set deletedAt = ? where id = ?', [new Timestamp(System.currentTimeMillis()), id])
    }

    return false
}

我曾经试图绕过类似的问题,问题是,当您按自己的方式进行更新时,不会立即进行更新,但它会转到hibernate的会话中,并且在刷新时会持久化,同时在访问对象时可能会出现这样的异常。Hql马上就把它保存起来

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29116139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档