给出以下域类:
class Location {
String city
static belongsTo = [ author: Author ]
}
class Author {
String name
Location location
}
当我这样做时:
def l = new Location(city: "Boston")
l.save()
def a = new Author(name: "Niall Ferguson", location: l)
a.save()
我可以使用a.delete()
删除我的作者,但如果我尝试使用l.delete()
删除我的位置,则会收到此错误:
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [Location#17]
好的,让我从关联中删除要删除的对象,然后再试一次:
author.location = null // Assuming these two statements are the right way
location.author = null // to to this.
现在,当我再次尝试l.delete()
时,我得到了这个:
ERROR util.JDBCExceptionReporter - Referential integrity constraint violation: "FKAC2D218B9615BDBA: PUBLIC.AUTHOR FOREIGN KEY(LOCATION_ID) REFERENCES PUBLIC.LOCATION(ID) (18)";
那么我做错了什么?在这种情况下,甚至可以删除位置并保留作者吗?
答案 0 :(得分:1)
当我尝试重现您的代码时,我的第一个错误是在l.save()中。在您的课程中,您的域位置中的字段作者是必需的。在示例中,如果没有作者,则无法保存位置。 你应该总是检查save()的返回值,或者使用failOnError:true 来发现这样的小错误。
话虽这么说,在我看来,你正在建立一对一的关系。不是多对一,否则一个位置如何有一个作者? (我同意grails文档在这个问题上有点混乱)
相反,我创建了以下类,假设作者有位置,但许多作者可以引用相同的位置。
class Author {
String name
Location location
}
class Location {
String city
}
现在您的参照完整性约束违规,基本上,您不能删除位置而不删除与该位置相关的所有作者。
如果你想删除级联工作,我会使用像这样的双向一对多关系
class Author {
String name
static belongsTo = [location: Location]
}
class Location {
String city
static hasMany = [authors: Author]
}
关于你的上一个问题,正如我理解你的情景,你不能删除一个位置并保留作者。我假设许多作者与同一地点有关。那么,如果删除该位置,那么所有作者对该位置的引用会发生什么?