【问题标题】:Grails Domain Object Not Being PersistedGrails 域对象没有被持久化
【发布时间】:2017-11-27 04:44:18
【问题描述】:

Grails 3.2.10、Gorm 6.1.4、Hibernate 5.2.9

我有一个 grails 域对象和一个相应的控制器,它执行基本的 crud 操作(它不是脚手架)。将 Command 对象提交给控制器的更新方法时,控制器会按预期执行(所有日志消息都按应有的方式打印)并且不会抛出任何错误。重定向页面的显示方式与您所期望的一样,并显示了 Flash 消息(即使是更新的数据)。但是,数据库值实际上并没有更新。我可以创建对象,它只用于更新。

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    这是一个众所周知的领域类问题。您必须在其他域类的方法中显式调用 setter 或 getter:

    class Person {
      String name
      void setData(PersonCommand c){
        setName c.name
      }
    }
    

    我还将 setData() 重命名为 applyData() 之类的东西,以避免与 POGO 方法发生冲突

    【讨论】:

    • 奇怪的是这段代码在 Gorm 6 和 Hibernate 5 之前运行良好。
    【解决方案2】:

    经过一番挫折,似乎最新的 Gorm 或 Hibernate 正在监视域对象上的 setXXX 方法,如果这些方法尚未被调用,hibernate 将不会看到对象已修改,也不会更新任何更改.调高日志级别帮助我看到 hibernate 没有将对象视为已修改,因此忽略了它。

    我的问题集中在调用this.xxx = CommandObject.xxx; 的域对象内部有setData(CommandObject) 方法,从而绕过生成的setter 并导致hibernate 认为对象没有被修改。

    直接从控制器调用设置器是解决此问题的方法。


    示例(不起作用):

    class Person {
      String name
      //...typical constraints, methods, etc...
      void setData(PersonCommand c){
        this.name = c.name;
      }
    }
    
    class PersonController {
      //...typical list, show, create methods...
      def update(PersonCommand pc){
         //... validation ...
         Person p = Person.get(pc.personId);
         p.setData(pc);
         p.save(failOnError: true);
         flash.message = "Successfully saved person ${p.name}"
         redirect(action: 'show', id: p.id)
      }
    }
    

    固定示例(确实有效):

    class Person {
      String name
      //...typical constraints, methods, etc...
    }
    
    class PersonController {
      //...typical list, show, create methods...
      def update(PersonCommand pc){
         //... validation ...
         Person p = Person.get(pc.personId);
         p.name = pc.name;
         //... set other fields ...
         p.save(failOnError: true);
         flash.message = "Successfully saved person ${p.name}"
         redirect(action: 'show', id: p.id)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多