在以下服务方法中,预期的行为是,如果我们尝试插入第二次标记为唯一的字段,则会引发异常。
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
}
}
答案 0 :(得分:1)
我建议使用自定义验证器,而不是唯一的true,因为它会进行优化。
以下是显示自定义验证程序的示例,其理由充分: http://www.tothenew.com/blog/grails-unique-constraint-optimization-part-2/