我遇到这个奇怪的错误,无法找到任何有关此问题的解决方案的解决方案,我认为其他问题与我的情况有关。
我在域中的afterInsert()
方法中遇到此问题
Class Employee {
/** other code **/
def afterInsert() {
println "Inserting..."
if (!hasAfterInsert) {
hasAfterInsert = true
DatabaseEvent.withTransaction { status ->
def dbEvent = new DatabaseEvent(loggedInUser: null,
type: "Created", entityClass: this.getClass().getName(), eventObjectId: this.id)
dbEvent.save(failOnError: true)
}
}
}
}
插入新员工后,我正在使用此方法创建记录,但是当我在afterInsert()
中使用此代码时,这会引发此错误。
我的DatabaseEvent
课程就像
class DatabaseEvent {
ObjectId id
String type
String entityClass
String eventObjectId
Date dateCreated
User loggedInUser
}
这就是:
E11000 duplicate key error index: myApp.Employee.$_id_ dup key: { : ObjectId('5631313fe4b0bbeba418859b') }
我不明白为什么在DatabaseEvent
中保存afterInsert()
对象时会发生这种情况?
答案 0 :(得分:0)
因此,当您保存Employee
的新实例时,您的GORM会话尚未刷新,这意味着您的新Employee
实例仍在GORM会话中,而您的新Employee
实例得到一个新的id
即ObjectId('5631313fe4b0bbeba418859b')
。
现在,在afterInsert()
方法中,您使用相同的事务来保存DatabaseEvent
的新实例。在保存DatabaseEvent
的新实例时,GORM再次刷新相同的GORM会话,并再次尝试使用值Employee
的{{1}}保存最近创建的id
实例导致重复键错误。
因此,只需更改ObjectId('5631313fe4b0bbeba418859b')
方法中的代码,即可使用afterInsert()
代替withNewSession
封闭,这应该可行。