Каскад Грааля удалить - PullRequest
       8

Каскад Грааля удалить

4 голосов
/ 06 февраля 2012

В моем домене Grails у меня есть отношение 1: 1 между Artist и MusicianDetails

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`))

Как правильно определить значение 1: 1 отношение между Artist и MusicianDetails такое, что удаляет первый каскад ко второму?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Каскадирование работает, если я удаляю художника, используя

artist.get(artistId)?.delete()

вместо

Artist.executeUpdate("delete Artist a where a.id = ?", [artistId])
0 голосов
/ 06 февраля 2012

Тебе нужно принадлежать в MusicianDetails.Не уверен, но вам также может понадобиться каскадировать 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-запроса.Это делает код менее подверженным ошибкам, более понятным, и вы всегда можете изменить GORM на другую реализацию, если по какой-либо причине хотите избавиться от Hibernate.

...