- 用户注册验证
在domain中有的属性并不一定要存放到数据库中去,只是在domain中使用而不保存到数据库,这样的属性称为瞬时属性,如下:
<!-- lang: groovy -->
class User {
static stransients = ["confirmPassword"]
String firstName
String lastName
String userName
String password
String email
String confirmPassword
}
这个confirmPassword只在domain中验证是否和password属性一致,判断用户注册时临时使用一次。
- 财务计算
再举一个例子,假如计算一个公司的净资产,需要将公司的“现金”、“应收款”、“注册资本”累加得到,而这个累加的值没必要记录到静态数据里,只是临时查询的时候计算一次,就可以使用这个瞬时属性,代码如下:
<!-- lang: groovy -->
class Company {
BigDecimal cash
BigDecimal receivables
BigDecimal capital
BigDecimal getNetWorth() {
cash + receivables + capital
}
static transients = ['netWorth']
}
如果一个domain中一个属性拥有getName()或setName()方法,那么这个属性就是一个持久化属性,并且可以使用class.name访问
- 派生属性使用场景
针对上面这个例子,假如netWorth需要保存到数据库记录,但是要随着其他属性的变化而变化,则可以使用派生属性来实现,派生属性实现方法就比上面的更容易了,代码如下:
<!-- lang: groovy -->
class Company {
BigDecimal cash
BigDecimal receivables
BigDecimal capital
BigDecimal netWorth
static mapping = {
netWorth formula: 'CASH + RECEIVABLES + CAPITAL'
}
}
这里需要注意的是关键字formula,需要数据库的支持,它并不在代码中执行,而是在数据库中执行。有的数据库可能不支持,所以这意味着需要牺牲数据库移植的问题。