Grails级联删除

时间:2012-02-06 10:46:06

标签: hibernate grails groovy gorm

在我的Grails域中,ArtistMusicianDetails之间的关系为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`))

ArtistMusicianDetails之间定义1:1关系的正确方法是什么,以便将前者级联删除到后者?

2 个答案:

答案 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更改为另一个实现。