在我的Grails域中,Artist
与MusicianDetails
之间的关系为1:1
class Artist {
static hasOne = [musicianDetails: MusicianDetails]
static constraints = {
musicianDetails(nullable: true, unique: true)
}
}
class MusicianDetails {
static belongsTo = [artist: Artist]
}
我希望删除Artist
级联到关联的MusicianDetails
。但是,当我删除Artist
时,我收到了外键约束违规:
Artist.executeUpdate("delete Artist a where a.id = ?", [artistId])
错误消息是:
Class
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
Message
Cannot delete or update a parent row: a foreign key constraint fails
(`festival2`.`musician_details`, CONSTRAINT `FKA0E6B2145ACE528E`
FOREIGN KEY (`artist_id`) REFERENCES `artist` (`id`))
在Artist
和MusicianDetails
之间定义1:1关系的正确方法是什么,以便将前者级联删除到后者?
答案 0 :(得分:1)
如果我使用
删除艺术家,则级联有效artist.get(artistId)?.delete()
而不是
Artist.executeUpdate("delete Artist a where a.id = ?", [artistId])
答案 1 :(得分:0)
你需要MusicianDetails中的belongsTo。不确定,但您可能还需要级联all-delete-orphan。
无论如何,似乎Musician Details可以是Artist的嵌入类,因此它被映射到一个数据库表。
http://bartling.blogspot.com/2009/04/embedded-domain-components-in-grails.html?m=1
另一件事是,最好是执行Artist.get(artistId).delete()而不是执行HQL查询。这使得代码不易出错,更容易理解,如果你想出于任何原因想要摆脱Hibernate,你总是可以将GORM更改为另一个实现。