我有一个域类,我在多个列上设置了一个唯一约束。即使failOnError在存在重复数据时设置为false,它仍会引发重复键入口违规。
// Domain
class Account {
String userName
String password
String userAccount
static constraints = {
userName(nullable:false);
password(nullable:false);
userAccount(nullable:false);
}
static mapping = {
table 'custdata'
userAccount(unique:['userName','password'])
}
}
// Controller
Account account = new Account(userName: 'X', userAccount: '123', password: '3456');
account.save(flush: true, failOnError: false)
答案 0 :(得分:0)
这是两件不同的事 - 1.当您将failOnError设置为false时 - 将不会从验证阶段抛出错误。 2.当您执行此userAccount(唯一:[' userName','密码'])时 - 这会通过引入唯一约束来更改基础数据库层。当您尝试保存重复数据时 - 会从数据库中抛出错误。
答案 1 :(得分:0)
据我了解您的业务逻辑,它要求用户名和密码字段在数据库级别是唯一的。
我不清楚的是,您是否需要独立或一起独有的字段
如果是第一种情况,您可以将责任委托给约束
static constraints = {
userName nullable:false, unique: true
password nullable:false, unique: true
userAccount nullable:false
}
如果是第二种情况,您可以使用验证器向字段添加自定义验证
static constraints = {
userName nullable:false
password nullable:false, validator: { password, obj ->
Account.where {
password == password &&
userName == obj.userName
}.count() ? true : false
}
userAccount nullable:false
}
第二个选项我没有测试过它,如果你实现它并且你发现问题让我知道并且我们正在使用它