2

我有一个域类,它扩展了另一个具有相同名称但在不同库中的不同包中的 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项目

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

如何重现:

  1. 运行应用程序。
  2. 创建一个新的模型对象(模型名称为 Derived)
  3. 使用编辑视图修改对象并单击更新。
  4. 您将看到修改没有持久化。
4

1 回答 1

1

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

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

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

我们对每个类别都有单独的项目:

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

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

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

在设计方面,我们喜欢我们的模型类在一个完全独立于 UI 或持久性技术(如 hibernate)的项目中。这样这些模型类就可以在各种不同的项目中使用,而无需任何额外的依赖。到目前为止,我们通过在我们的库中创建一个扩展实际模型类的新类来实现这一点

有什么办法可以在不修改基类的情况下解决这个问题?

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

于 2017-12-19T09:13:34.700 回答