【发布时间】:2011-07-24 22:42:36
【问题描述】:
我使用的是 Grails 1.3.7,并且有以下域类:
package com.fxpal.test
class UserGroup {
String name
static constraints = {
name(blank: false)
}
}
class Invitation {
UserGroup group
String user
static belongsTo = [group: UserGroup]
static constraints = {
group(nullable: false)
}
}
我希望能够在删除 UserGroup 实例时删除所有引用 UserGroup 实例的 Invitation 实例,而无需在 UserGroup 中建立引用 Invitation 的显式关系。换句话说,我想从 UserGroup 级联删除到 Invitation,而不修改 Group。
由于表示邀请 -> 用户组关系的约束,我对此的测试失败:
void testCascadingDelete() {
UserGroup group1 = new UserGroup(name: 'group1').save(flush: true, failOnError: true)
UserGroup group2 = new UserGroup(name: 'group2').save(flush: true, failOnError: true)
Invitation invitation = new Invitation(user:'user1', group: group1).save(flush: true, failOnError: true)
assertEquals("Wrong number of groups.", 2, UserGroup.count())
assertEquals("Wrong number of invitations.", 1, Invitation.count())
group1.delete(flush: true, failOnError: true)
assertEquals("Wrong number of groups.", 1, UserGroup.count())
assertEquals("Wrong number of invitations.", 0, Invitation.count())
}
当我运行测试时,它会像这样失败:
could not delete: [com.fxpal.test.UserGroup#1]; SQL [delete from user_group where id=? and version=?]; constraint [FK473F7799A8642225]; nested exception is org.hibernate.exception.ConstraintViolationException: could not delete: [com.fxpal.test.UserGroup#1]
org.springframework.dao.DataIntegrityViolationException: could not delete: [com.fxpal.test.UserGroup#1]; SQL [delete from user_group where id=? and version=?]; constraint [FK473F7799A8642225]; nested exception is org.hibernate.exception.ConstraintViolationException: could not delete: [com.fxpal.test.UserGroup#1]
at com.fxpal.test.InvitationIntegrationTests.testCascadingDelete(InvitationIntegrationTests.groovy:23)
Caused by: org.hibernate.exception.ConstraintViolationException: could not delete: [com.fxpal.test.UserGroup#1]
at com.fxpal.test.InvitationIntegrationTests.testCascadingDelete(InvitationIntegrationTests.groovy:23)
...
这似乎是典型的鼻脸示例,但级联删除似乎不起作用。我真的不想在 UserGroup 中表示邀请,特别是因为最后,邀请将引用其他几个域类,删除其中任何一个都会导致相应的邀请也被删除。
我错过了什么?
基因
【问题讨论】:
标签: grails grails-orm cascading-deletes