【问题标题】:Grails cascade deleteGrails级联删除
【发布时间】:2012-02-27 20:35:41
【问题描述】:

在我的 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 关系以便删除前者级联到后者的正确方法是什么?

【问题讨论】:

    标签: hibernate grails groovy grails-orm


    【解决方案1】:

    如果我使用删除艺术家,级联工作

    artist.get(artistId)?.delete()
    

    而不是

    Artist.executeUpdate("delete Artist a where a.id = ?", [artistId])
    

    【讨论】:

    • 那是因为 HQL 更新/删除直接进入数据库(翻译),不执行 Hibernate 事件,这些事件负责删除孤儿(它不是数据库中的触发器)
    【解决方案2】:

    您需要 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 更改为其他实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多