【问题标题】:Grails - Unique constraint not working as expectedGrails - 唯一约束未按预期工作
【发布时间】:2018-07-21 09:35:33
【问题描述】:

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

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

【问题讨论】:

  • 我试图在我的水晶球中查看您的域类 TaskLock,但只看到了雾。您能否提供一些帮助并说明您是如何设置约束的?
  • @AntonHlinisty 添加了域类。

标签: grails grails-orm


【解决方案1】:

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

这是一个展示自定义验证器的示例,理由很充分:- http://www.tothenew.com/blog/grails-unique-constraint-optimization-part-2/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多