考虑以下grails域类:

Test.groovy

package test

class Test {
    Integer month
    Integer year
    String performancePeriod = ""

    static constraints = {
        month(range:01..12, nullable:true)
        year(range:2010..2020, nullable:false)
        performancePeriod(nullable:true)
    }

    String getPerformancePeriod() {
        if(month) {
            "${month?.toString().padLeft(2,'0')}.${year?.toString()}"
        }
        else {
            getYearStringFormat()
        }
    }

    String getPerformancePeriodDate(){
        return new GregorianCalendar(year, month, 1).time
    }

    String getJahrStringFormat() {
        year ? year.toString() : ""
    }

    String getMonatZweiStellig() {
        month? month.toString().padLeft(2,'0') : ""
    }
}

它是遗留代码。我知道设计不好,因为表示逻辑绑定(bind)到域对象。表示逻辑是指performancePeriod属性,其唯一目的是提供表示年份和日期的String格式。

现在,生成 Controller 并搭建 View 。如果在不设置Test的情况下创建新的performancePeriod记录,则将使用getPerformancePeriod方法中给出的逻辑隐式设置属性。

我无法理解这种行为。我知道设计一开始就很糟糕,尤其是由于功能依赖{year, month} -> performancePeriod,但是performancePeriod什么时候保存到数据库中?在决定设置值之前,为什么不能决定使它为null?

最佳答案



您可以。当持久性引擎持久化您的对象时,它必须查询该对象以检索特定属性的值。当引擎要求您提供performancePeriod属性的值时,您永远不会返回null。持久化引擎将持久化,无论您告诉它performancePeriod属性的值是什么。您已经在域类中混淆了一些问题,而您描述为有问题的行为就是这种情况的结果。

编写类的方式有些特殊,这有几个原因。 performancePeriod字段从未被用于任何东西。从您的问题中我无法确定,但可能部分原因是您没有在字段的定义和属性的定义之间进行区分。

关于hibernate - 重写隐式getter时,Grails域类的行为异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30977128/

10-16 09:40