Grails提供了 constraints 的 DSL 来进行数据定义与校验,可以通过 unique 关键字来设置字段唯一性校验,此时会自动生成唯一性的索引,如:
class Foobar {
String name
String code
String unit
static constraints = {
name(nullable:false, blank:false, unique:['code','unit'])
}
}
上面的Domain中,会同时对 name、code、unit 三个字段进行唯一性校验(类似联合主键),并生成数据库索引。
但是在Grails中,如果是 update,则会自动校验并设置 bean.errors,可是如果是 insert,则不会执行校验而是直接抛出数据库异常。
在Grails修复该问题前,可以配置自定义校验器validator、并调用BroToolkit的API进行多字段的唯一性校验:
name(nullable:false, blank:false, unique:['code','unit'],
validator: bropen.toolkit.utils.grails.BeanUtils.getGroupUniqueValidator('name'))
此外,如果是继承的 Domain 类,无法在子类中的 constraints 中设置 unique 并生成唯一索引,此时仍然可以通过 validator 来实现多字段唯一性校验,如:
// 将 uniqie 的字段名,作为 getGroupUniqueValidator 的第二个参数。
name(nullable:false, blank:false,
validator: bropen.toolkit.utils.grails.BeanUtils.getGroupUniqueValidator('name', ['code','unit']))