Grails 3.1.1 - 当模型类扩展另一个groovy类时,脏检查不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Grails 3.1.1 - 当模型类扩展另一个groovy类时,脏检查不起作用相关的知识,希望对你有一定的参考价值。

我有一个域类,它扩展了另一个具有相同名称但在不同库中的不同包中的groovy类。

问题是当我修改域类上的实例时,它没有标记为脏,因此不会保留更改。

我已经读过grails 3发行版对脏检查有一些改进,这可能是一个错误,或者我遗漏了一些东西。

正确保存新对象没有任何问题,我在修改后的域对象上使用了isDirty()方法以及修改后的属性,并且都返回false。对象附加到会话,使用isAttached()进行确认。

为了重现,我使用以下代码创建了一个测试项目,并尝试使用脚手架生成的默认grails视图更新对象,但仍然没有保留更改。

注意:我在Grails 2.4中做过类似的事情并且它曾经工作过。

域类如下:

package com.perseus

class Derived extends Base{

    static constraints = {
        name blank: false, nullable: false
    }

}

src / main / groovy中的基类:

package com.perseus

class Base implements Serializable {

    private static final long serialVersionUID = 1L

    String name

}

调节器

package com.perseus

class DerivedController {

    static scaffold = Derived

}

链接到github project

问题:即使已修改模型,模型也不会标记为脏。当模型类扩展另一个groovy类时会发生这种情况。

如何重现:

  1. 运行应用程序。
  2. 创建新的模型对象(模型名称为Derived)
  3. 使用编辑视图修改对象,然后单击“更新”。
  4. 您将看到修改不会持久存在。
答案

最后我找到了一个参考here,它解释了更新脏检查状态失败的原因。

我添加了@DirtyCheck注释,它解决了问题。

然而,这会对我们图书馆的设计产生负面影响。

我们为每个类别分别开展项目:

  • 商业模式类
  • 业务逻辑类
  • 用户界面

我们的想法是让模块完全相互独立。因此,任何UI技术都可以使用模型和业务逻辑库。现在的问题是我必须将gorm依赖项添加到我的业务模型项目中以进行注释。

compile 'org.grails:grails-datastore-gorm:6.1.7.RELEASE'

设计明智我们喜欢我们在完全独立于UI或hibernate等持久技术的项目中的模型类。这样,这些模型类可以用于各种不同的项目,而不需要任何其他依赖项。到目前为止,我们通过创建一个扩展库中实际模型类的新类来实现这一目标

有没有办法解决这个问题,而不修改基类?

简而言之,模型类(POJO)现在依赖于grails框架,而在早期版本中则不是。

以上是关于Grails 3.1.1 - 当模型类扩展另一个groovy类时,脏检查不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中使用 java 类

在另一个域类中查看 grails 域类属性

从 Grails 中的布局视图访问模型

Grails:根据另一个组合框加载数据

Grails:从另一个标签库中调用一个标签库

动态连接到 grails 中的数据库