Grailsのカスケード削除

In my Grails domain I have a 1:1 relationship between Artist and MusicianDetails

class Artist {

    static hasOne = [musicianDetails: MusicianDetails]

    static constraints = {
        musicianDetails(nullable: true, unique: true)
    }           
}

class MusicianDetails {
    static belongsTo = [artist: Artist]
}

私は関連する MusicianDetails にカスケードする 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`))

Artist MusicianDetails との間に前者のカスケードを削除するような1:1の関係を定義する正しい方法は何ですか?

4

2 答え

カスケーディングは、アーティストを削除すると

artist.get(artistId)?.delete()

の代わりに

Artist.executeUpdate("delete Artist a where a.id = ?", [artistId])
1
追加された
これは、HQLの更新/削除が直接データベースに送られ(翻訳され)、孤児を削除するHibernateイベントを実行しないためです(DB内のトリガーではありません)
追加された 著者 JesperSM,

MusicianDetailsにbelongsToが必要です。わかりませんが、孤立しているすべてのファイルをカスケードする必要があるかもしれません。

とにかく、ミュージシャンの詳細がアーティストの組み込みクラスであるように見えるので、1つのデータベーステーブルにマッピングされます。

http://bartling.blogspot.com /2009/04/embedded-domain-components-in-grails.html?m=1

もう1つのことは、HQLクエリを実行する代わりにArtist.get(artistId).delete()を実行する方が良いことです。これにより、コードがエラーを起こしにくくなり、理解しやすくなります。何らかの理由でHibernateを取り除きたい場合は、GORMを別の実装に変更することができます。

0
追加された