【发布时间】: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