我遇到了某些我没有想到的行为。我有一个具有status的对象。该对象有两个状态,进行中和关闭。当对象正在进行时,我希望计算状态而不将其保存在数据库中……但是,一旦我将其关闭/完成,则需要保存状态。

以下是我尝试设置的方式:

class Assessment{
  AssessmentStatus status
  List<Score> scores
  static hasMany = [scores: Score]


  AssessmentStatus getStatus() {

    if(status){
      return status
    }

    if (!scores || event.eventDateTime.after(new Date())) {
      return AssessmentStatus.PRE_EVENT
    }

    scores.each{
      if (it.incompleteReason){
        return AssessmentStatus.INCOMPLETE
      }
    }

    if (!getPassing()) {
      return AssessmentStatus.FAIL
    }

    return AssessmentStatus.PASS
  }

  Boolean getPassing() {
    def passing = Boolean.TRUE
    this.scores.each {score ->
      if (!score.passingScore){
        passing = Boolean.FALSE
      }
    }
    return passing
  }
}

如您所见,我期待检查的代码可以看到我期待检查状态是否为null。如果status不为null,则将其返回。如果为null,则进行其他计算。但是...由于某种原因,计算出的状态将持久化到数据库中。现在我知道我可以随时加入:
if(finalized){
  return status
}

VS if(status),我会得到正确的返回。但是...我不要数据库中的垃圾数据。另一种方法是不覆盖 setter/getter 。

我的问题基本上可以归结为。为什么要覆盖将 setter/getter 写入数据库,并且有解决方法?

最佳答案

除非您另外明确定义,否则所有字段都将持久保存到数据库中。您正在重写 setter/getter 这一事实并不会自动告诉Grails您不想将该属性持久化到数据库中。为此,必须将属性定义为 transient :

  static transients = ['status']

关于grails - Grails setter/getter 写入数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24121294/

10-09 15:46
查看更多