2013-05-21 43 views
0

我試圖使用mongoDB grails插件將我的一些域類放到MongoDB中。一些類保留在MySQL中。即使將域類實例保存到MongoDB中,也可以正常工作(例如在控制器代碼中使用)。但是,如果我嘗試從某些not-mongoDB類的afterUpdate()中保存實例,它不起作用。它不拋出任何異常或任何...Grails MongoDB不保存在afterUpdate

我不-的MongoDB領域類:

class CarState extends AbstractCarState { 

    ... 

    def afterUpdate() { 
     def logItemInstance = new CarStateLogItem(this.properties) 
     logItemInstance.save(failOnError: true) 
    } 
} 

的MongoDB領域類:

class CarStateLogItem extends AbstractCarState { 
    ObjectId id 

    static mapWith = "mongo" 

    ... 
} 

奇怪的是,如果我運行來自控制器的afterUpdate()代碼將其保存到MongoDB中。我缺少什麼?或者爲什麼我不能保存實例?

感謝您的任何建議, 刁

回答

1

我認爲你需要,以便在MongoDB中保存到啓動新的transaction。如果您注意到,CarState的交易將爲MySQL。爲了與來自afterUpdate事件的mongodb進行交易,必須有新的mongodb交易。嘗試這個。

def afterUpdate() { 
    CarStateLogItem.withTransaction{status -> 
     def logItemInstance = new CarStateLogItem(this.properties) 
     logItemInstance.save(failOnError: true) 
    } 
} 
+0

This Works!我正在嘗試CarStateLogItem.withNewSession,但顯然它沒有工作,因爲據我所知這與hibernate會話有關。我不明白的(因爲缺乏我的Spring交易知識)是它從控制器運作的原因。是否就像我有事務時(即transactional = true的服務)當前與MySQL關聯的事務被採用? – kuceram

+0

服務層中的事務與「數據源」關聯。我很確定你會有一個MySQL數據源而不是mongodb。 – dmahapatro