Grails多对一级联删除麻烦

时间:2015-04-26 16:23:45

标签: grails

给出以下域类:

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)";

那么我做错了什么?在这种情况下,甚至可以删除位置并保留作者吗?

1 个答案:

答案 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]
}

关于你的上一个问题,正如我理解你的情景,你不能删除一个位置并保留作者。我假设许多作者与同一地点有关。那么,如果删除该位置,那么所有作者对该位置的引用会发生什么?