我试图找到适当的方式来实现对我的实体数量的软删除。到目前为止,我发现最好的方法是使用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我已经尝试了一切,包括用新会话和新事务包装它,没有任何帮助。我遗漏了什么?
谢谢你的建议。亚历克斯。
如果我将服务标记为NotTransactional,没有错误,但是没有更新。
发布于 2015-03-18 07:39:46
我不知道这是否有帮助,但也许您可以尝试在beforeDelete()中使用hql:
def beforeDelete() {
if (deletedAt == null) {
Goal.executeUpdate('update Goal set deletedAt = ? where id = ?', [new Timestamp(System.currentTimeMillis()), id])
}
return false
}我曾经试图绕过类似的问题,问题是,当您按自己的方式进行更新时,不会立即进行更新,但它会转到hibernate的会话中,并且在刷新时会持久化,同时在访问对象时可能会出现这样的异常。Hql马上就把它保存起来
https://stackoverflow.com/questions/29116139
复制相似问题