即使failOnError设置为false,也会出现唯一约束违规

时间:2018-04-04 18:06:17

标签: grails gorm

我有一个域类,我在多个列上设置了一个唯一约束。即使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)   

2 个答案:

答案 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
}

第二个选项我没有测​​试过它,如果你实现它并且你发现问题让我知道并且我们正在使用它