我有简单的域:
package app
class Customers {
String CUSTOMER
String NOTE
static mapping = {
version false
id column: 'ID_CUSTOMER', type: 'long',
generator: 'sequence',
params: [sequence: 'CUSTOMER_SEQ']
}
static constraints = {
CUSTOMER(nullable: false, blank: false, unique: ['NOTE'])
NOTE(nullable: true, blank: true)
}
}
在数据库中正确创建了列和约束(我想同时约束客户和注释),但是没有得到:
grails.validation.**ValidationException**
我正进入(状态:
Message: Hibernate operation: could not execute statement; SQL [n/a]; ORA-00001: unique constraint (TEST2.UNIQUE_CUSTOMER_NOTE) violated
; nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TEST2.UNIQUE_CUSTOMER_NOTE) violated
违反约束条件时,是否应该获取 ValidationException ?
Controller 代码是由
generate-all
脚本生成的标准自动代码。
最佳答案
您没有显示任何 Controller 代码-您是否正在检查validate()
和save()
调用的返回值(或使用hasErrors()
)并重定向回去,以便用户可以纠正错误?
如果更改一个或两个值并且它们不再唯一,但是您不会调用validate()
或save()
,则将看到您所看到的结果。这是因为在请求结束时,由于已刷新 session ,所有已修改的实例都将在数据库中更新,并且Hibernate使用其原始值的缓存副本来检测尚未保存和刷新的已修改/脏实例。
如果您更改了一个值但不打算保存更改(例如,如果仅为渲染GSP设置了值),请确保通过调用discard()
从 session 中退出该实例-Hibernate不会尝试推送这些更改,如果实例不再附加到 session 。
关于validation - 如何捕获grails.validation.ValidationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27293321/