Grails-唯一约束未按预期工作

时间:2018-07-21 09:35:34

标签: grails gorm

在以下服务方法中,预期的行为是,如果我们尝试插入第二次标记为唯一的字段,则会引发异常。

groupingBy

字段taskName是唯一的。如果我们尝试插入具有重复的taskName的TaskLock,则不会引发异常。但是另一方面,数据库中的原始值也不会更新(日期仍保留在原始插入中)。

如果将以上代码更改为以下代码:

def lock(String task) {
    TaskLock lock = new TaskLock(taskName: task, lockTime: new Date())
    try {           
        lock.save(flush: true, failOnError: true)
    } catch (Exception e) {
        //Do something
    }           
}

然后一切正常。有人可以向我解释为什么会发生这种情况(似乎链接到本地​​Hibernate缓存),并且在上面的示例中获取唯一约束的正确方法是什么?使用Grails 3.3.2。带有单个数据源的内存H2 db。

编辑:添加了TaskLock域类:

def lock(String task) {
    TaskLock lock = new TaskLock(taskName: task, lockTime: new Date())
    try {
        TaskLock.getAll()
        lock.save(flush: true, failOnError: true)
    } catch (Exception e) {
        //Do something
    }           
}

1 个答案:

答案 0 :(得分:1)

我建议使用自定义验证器,而不是唯一的true,因为它会进行优化。

以下是显示自定义验证程序的示例,其理由充分: http://www.tothenew.com/blog/grails-unique-constraint-optimization-part-2/