E11000重复键错误索引 - Grails afterInsert()方法

时间:2015-10-28 20:43:20

标签: mongodb grails

我遇到这个奇怪的错误,无法找到任何有关此问题的解决方案的解决方案,我认为其他问题与我的情况有关。

我在域中的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()对象时会发生这种情况?

1 个答案:

答案 0 :(得分:0)

因此,当您保存Employee的新实例时,您的GORM会话尚未刷新,这意味着您的新Employee实例仍在GORM会话中,而您的新Employee实例得到一个新的idObjectId('5631313fe4b0bbeba418859b')

现在,在afterInsert()方法中,您使用相同的事务来保存DatabaseEvent的新实例。在保存DatabaseEvent的新实例时,GORM再次刷新相同的GORM会话,并再次尝试使用值Employee的{​​{1}}保存最近创建的id实例导致重复键错误。

因此,只需更改ObjectId('5631313fe4b0bbeba418859b')方法中的代码,即可使用afterInsert()代替withNewSession封闭,这应该可行。