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

标签 grails gorm

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

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

字段taskName是唯一的。如果我们尝试插入具有重复的taskName的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
    }           
}

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

编辑:添加了TaskLock域类:
class TaskLock {       
    String taskName
    Date lockTime

    static mapping = {
        version false
        id name: 'taskName', column: 'TASK_NAME', generator: 'assigned'
    }

    static constraints = {
        taskName(unique: true, nullable: false)
    }
}

最佳答案

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

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

关于grails - Grails-唯一约束未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51454745/

相关文章:

angularjs - 如何将服务注入(inject) Grails 3 命令?

grails - Geb + cucumber : Restart Browser Between Scenarios

hibernate - 如何使用 Joda Time 查询 HQL (Hibernate) 中的日期?

grails - 具有多个约束的gorm实体

mongodb - Grails GORM + Mongo,如何将自定义数据保存到ID?

oracle - 使用具有参数的GORM在一对一Grails域上加入查询

java - Hibernate - 集合未填充所有子项

grails - 将列的求和值与另一列进行比较-条件不正确

grails - Grails/Gorm:如何在不影响数据库的情况下过滤域对象列表

grails - 如何在BootStrap.groovy init中创建具有多个关系的对象