我正在尝试在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
我的问题是,如何在第二次保存操作后获得异常 - 重要的是要知道第二个标记没有被保留,因此对它的所有进一步操作都没有意义。
答案 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