【问题标题】:Grails MongoDB doesn't save in afterUpdateGrails MongoDB 不保存在 afterUpdate 中
【发布时间】:2013-05-21 07:48:37
【问题描述】:

我正在尝试使用 mongoDB grails 插件将我的一些域类放入 MongoDB。一些类保留在 MySQL 中。即使将域类实例保存到 MongoDB 中(例如在控制器代码上的服务中),一切都可以正常工作。但是,如果我尝试从某些非 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 中。我是不是少了点什么?或者为什么我无法保存实例?

感谢您的任何建议, 马特奥

【问题讨论】:

    标签: mongodb grails grails-orm grails-plugin


    【解决方案1】:

    我认为您需要启动一个新的transaction 才能保存在 mongodb 中。如果您注意到,CarState 的交易将是MySQL。为了与 afterUpdate 事件中的 mongodb 进行交易,必须有一个新的 mongodb 交易。试试这个。

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

    【讨论】:

    • 这行得通!我正在尝试 CarStateLogItem.withNewSession 但显然它不起作用,因为据我所知,这与休眠会话有关。我不明白(因为缺乏我的 Spring Transaction 知识)是为什么它可以从控制器工作。当我有一个事务(即事务 = true 的服务)时,是否会采用与 MySQL 关联的当前事务?
    • 服务层中的事务与datasource相关联。我很确定你会有一个 MySQL 数据源而不是 mongodb。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多