我们允许数据库中的重复记录,但id除外。更新记录时,我们希望查找并更新任何重复项。通过研究,我发现了Hibernate的事件方法beforeUpdate和afterUpdate。问题是,当我发现重复并开始迭代它们时,我得到了这个错误:
错误:行被另一个事务更新或删除(或未保存的值映射不正确)
以下是我在域中的afterUpdate代码:
1 def afterUpdate() {
2 println "\n*** afterUpdate ***"
3 def record = this
4
5 DomainObject.createCriteria().list() {
6 ne( 'id', record.id )
7 or {
8 eq( 'storeId', record.storeId )
9 and {
10 eq( 'firstName', record.firstName )
11 eq( 'lastName', record.lastName )
12 eq( 'dateOfBirth', record.dateOfBirth )
13 }
14 }
15 //eq( 'lastUpdated', record.lastUpdated )
16 }.each { dupe ->
17 log.info "syncing ${dupe.id} with ${record.id}"
18 dupe.properties.each{ key, value ->
19 println "*** prop: ${key}: ${value}"
20 }
21 }
22 }
23
错误在第19行。我们正在使用Grails 2.4.4并在Windows上开发
答案 0 :(得分:2)
看看Uri page。请注意本节有关class Person {
String name
def beforeDelete() {
ActivityTrace.withNewSession {
new ActivityTrace(eventName: "Person Deleted", data: name).save()
}
}
}
:
{{1}}
注意上面使用withNewSession方法。因为事件是 在Hibernate使用持久化方法冲洗时触发了 除非你运行,否则save()和delete()不会导致保存对象 使用新会话进行操作。
幸运的是,withNewSession方法允许您共享相同的内容 事务性JDBC连接,即使您使用不同的连接 基础会议。