Domain中如何校验多个字段的唯一性?
李小翔
2014-06-11 15:35

内容列表

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’]))