2017-12-18 202 views
0

我有一个域类,它扩展了另一个具有相同名称但不同包中的groovy类,但是在不同的库中。Grails 3.1.1 - 模型类扩展另一个常规类时脏检查不工作

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

我读过那个grails 3发行版有一些增强的脏检查&这可能是一个bug或者我错过了一些东西。

新对象正确保存没有任何问题,我已经使用isDirty()修改域对象以及修改的属性&上方法都返回。对象附加到会话中,通过确定isAttached()

为了重现,我创建了一个测试项目,代码如下:&尝试更新使用脚手架生成的默认grails视图中的对象,但这些更改仍未保留。

注意:我已经做了类似的东西在Grails 2.4 &它曾经工作。

域类如下:

package com.perseus 

class Derived extends Base{ 

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

} 

基类中的src /主/常规

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

Isssue:即使模型已被修改,模型也未标记脏。当模型类扩展另一个常规类时会发生这种情况。

如何重现:

  1. 运行应用程序。
  2. 创建一个新模型对象(型号名称衍生)
  3. 使用编辑视图修改对象&单击更新。
  4. 您将看到修改不会持续。
+0

这里没有足够的信息来知道什么是错的。有很多解释为什么一个对象在尝试更新后可能不会被认为是脏的。 –

+0

我会尝试用一个非常小的项目重现它并共享一个链接。说实话,没有什么要补充的,我的观点是使用脚手架创建的,当我更新域时,更改不会持续。给我一些时间,我会回来更多的细节。 –

+0

使用示例代码更新了问题,还给出了重现项目问题&github链接的步骤。 –

回答

0

最后,我找到了一个参考here,它说明了无法更新脏检查状态的原因。

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

但是这对我们的图书馆的设计有负面影响。

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

  • 业务模型类
  • 业务逻辑类
  • 用户界面

的想法是有完全相互独立的模块。因此,任何UI技术都可以使用模型&业务逻辑liraries。现在的问题是,我不得不向我的业务模型项目添加gorm依赖注释。

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

设计明智的,我们喜欢在完全独立的UI或持续性的技术如Hibernate的项目我们的模型类。以便这些模型类可以用于各种不同的项目,而无需任何额外的依赖项。我们通过创建一个新的类来实现这一点,它扩展了我们库中的实际模型类

有没有什么办法可以解决这个问题,而不需要修改基类?

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

+0

我怀疑,你在这个答案中的问题会得到很多的曝光。为什么不创建一个新的问题并在那里提供这个答案? – cfrick