Groovy&Grails-代码剪辑-瞬时属性

  • 用户注册验证

在domain中有的属性并不一定要存放到数据库中去,只是在domain中使用而不保存到数据库,这样的属性称为瞬时属性,如下:


class User {
    static stransients = ["confirmPassword"]

    String firstName
    String lastName
    String userName
    String password
    String email

    String confirmPassword
}

这个confirmPassword只在domain中验证是否和password属性一致,判断用户注册时临时使用一次。

  • 财务计算

再举一个例子,假如计算一个公司的净资产,需要将公司的“现金”、“应收款”、“注册资本”累加得到,而这个累加的值没必要记录到静态数据里,只是临时查询的时候计算一次,就可以使用这个瞬时属性,代码如下:


class Company {
    BigDecimal cash
    BigDecimal receivables
    BigDecimal capital

    BigDecimal getNetWorth() {
        cash + receivables + capital
    }

    static transients = ['netWorth']
}

如果一个domain中一个属性拥有getName()或setName()方法,那么这个属性就是一个持久化属性,并且可以使用class.name访问

  • 派生属性使用场景

针对上面这个例子,假如netWorth需要保存到数据库记录,但是要随着其他属性的变化而变化,则可以使用派生属性来实现,派生属性实现方法就比上面的更容易了,代码如下:


class Company {
    BigDecimal cash
    BigDecimal receivables
    BigDecimal capital
    BigDecimal netWorth

    static mapping = {
        netWorth formula: 'CASH + RECEIVABLES + CAPITAL'
    }
}

这里需要注意的是关键字formula,需要数据库的支持,它并不在代码中执行,而是在数据库中执行。有的数据库可能不支持,所以这意味着需要牺牲数据库移植的问题。

你可能感兴趣的:(Groovy&Grails-代码剪辑-瞬时属性)