Hibernate Grails级联删除
在我的Grails领域中,Hibernate Grails级联删除,hibernate,grails,groovy,gorm,Hibernate,Grails,Groovy,Gorm,在我的Grails领域中,Artist和MusicianDetails class Artist { static hasOne = [musicianDetails: MusicianDetails] static constraints = { musicianDetails(nullable: true, unique: true) } } class MusicianDetails { static belong
Artist
和MusicianDetails
class Artist {
static hasOne = [musicianDetails: MusicianDetails]
static constraints = {
musicianDetails(nullable: true, unique: true)
}
}
class MusicianDetails {
static belongsTo = [artist: 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`))
什么是正确的方法来定义艺术家
和音乐家细节
之间的1:1关系,从而删除前一个层级到后一个层级?在音乐家细节中需要一个belongsTo。不确定,但您可能还需要级联所有删除孤立项
无论如何,音乐家细节似乎可以是一个嵌入的艺术家类,所以它被映射到一个数据库表
另一件事是,最好执行Artist.get(artistId).delete()而不是执行HQL查询。这使得代码不太容易出错,更容易理解,如果出于任何原因想要摆脱Hibernate,您可以随时将GORM更改为另一个实现。如果我使用
artist.get(artistId)?.delete()
而不是
Artist.executeUpdate("delete Artist a where a.id = ?", [artistId])
这是因为HQL更新/删除直接进入数据库(翻译),而不执行Hibernate事件,这些事件负责删除孤立项(它不是数据库中的触发器)