Mongodb E11000重复键错误索引-Grails afterInsert()方法
我犯了一个奇怪的错误,在这个问题上找不到任何解决方案,我想我的案子还有其他问题 我在域中的Mongodb E11000重复键错误索引-Grails afterInsert()方法,mongodb,grails,Mongodb,Grails,我犯了一个奇怪的错误,在这个问题上找不到任何解决方案,我想我的案子还有其他问题 我在域中的afterInsert()方法中遇到了这个问题,如下所示 Class Employee { /** other code **/ def afterInsert() { println "Inserting..." if (!hasAfterInsert) { hasAfterInsert = true Dat
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()
?中时会发生这种情况。因此,当您保存员工的新实例时,您的GORM会话尚未刷新,这意味着您的新Employee
实例仍在GORM会话中,并且您的新Employee
实例获得了一个新的id
,即ObjectId('563131313FE4B0BBEBEBEA418859B')
现在,在afterInsert()
方法中,您使用相同的事务来保存DatabaseEvent
的新实例。在保存DatabaseEvent的新实例时,GORM再次刷新同一GORM会话,并且最近创建的Employee
实例再次尝试使用相同的id
和值ObjectId('5631313FE4B0BBEBEBEA418859B')
进行保存,这导致了重复的密钥错误
因此,只需在afterInsert()
方法中将代码更改为使用with newsession
而不是with transaction
closure,这应该会起作用。因此,在保存员工的新实例时,您的GORM会话尚未刷新,这意味着您的新Employee
实例仍在GORM会话中,并且您的新Employee
实例获得了一个新的id
,即ObjectId('563131313FE4B0BBEBEBEA418859B')
现在,在afterInsert()
方法中,您使用相同的事务来保存DatabaseEvent
的新实例。在保存DatabaseEvent的新实例时,GORM再次刷新同一GORM会话,并且最近创建的Employee
实例再次尝试使用相同的id
和值ObjectId('5631313FE4B0BBEBEBEA418859B')
进行保存,这导致了重复的密钥错误
因此,只需在afterInsert()
方法中将您的代码更改为使用with newsession
而不是with transaction
closure,就可以了。关于这个问题的任何帮助。.当然。把答案贴在那里。这个问题有什么帮助吗?当然。把答案贴在那里。