Grails - 如何设置抛出异常的唯一约束

时间:2014-01-05 21:41:13

标签: grails gorm unique-constraint

我正在尝试在DB中定义唯一约束。我们来看简单的域类

class Tag {

    String name

    static mapping = {
        sort name: "asc"
    }

    static constraints = {
        name(blank: false, nullable: false, unique: true)
    }
}

然后在控制器中

  def test() {

        def tag = new Tag(name: 'test');
        tag.save(flush:true);
        print tag.id

        tag = new Tag(name: 'test');
        tag.save(flush:true);
        print tag.id

        render "it works"
    }

输出

1
null

我的问题是,如何在第二次保存操作后获得异常 - 重要的是要知道第二个标记没有被保留,因此对它的所有进一步操作都没有意义。

2 个答案:

答案 0 :(得分:2)

您可以使用failOnError实现此行为。

但是这样在发生任何验证错误时抛出ValidationException,而不仅仅是唯一约束。

  tag = new Tag(name: 'test');
  tag.save(flush:true, failOnError: true);
  print tag.id

答案 1 :(得分:1)

您还可以通过在grails-app / conf / Config.groovy中添加以下条目来查看save()期间引发的异常

grails.gorm.failOnError=true

save方法通知持久化上下文应保存或更新实例 可以有以下可选参数

save(validate:true, flush:true, failOnError:true)

参数:

validate(可选) - 如果应该跳过验证,则设置为false

flush(可选) - 设置为true时刷新持久性上下文,立即保留对象并更新版本列以进行乐观锁定

failOnError(可选) - 当设置为true时,如果验证失败,则抛出grails.validation.ValidationException的save方法。

insert(可选) - 当设置为true时,将强制Hibernate执行SQL INSERT

deepValidate(可选) - 确定是否还应验证域实例的关联,即验证是否级联。默认情况下为true - 设置为false以禁用级联验证。

尝试使用这种方式并查看保存期间引发的所有错误。

if (!tag.save()) {  
       tag.errors.each {  
        println it  
    }  
}

希望这有助于你

问候
Motilal