欢迎进入Wiki » FAQ » Domain中如何校验多个字段的唯一性?

Domain中如何校验多个字段的唯一性?

在2014-06-11 15:35上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

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']))
标签: BroToolkit grails
在2014-05-26 16:15上被李小翔创建

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号