Hibernate 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

在我的Grails领域中,
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事件,这些事件负责删除孤立项(它不是数据库中的触发器)