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,就可以了。

关于这个问题的任何帮助。.当然。把答案贴在那里。这个问题有什么帮助吗?当然。把答案贴在那里。