Hibernate обновляет дочернюю сущность с нуля, а не удаляет, как заставить его? - PullRequest
1 голос
/ 08 марта 2012

У меня есть объект Playlist, которому принадлежит коллекция клипов с аннотацией CascadeType.All. Хотя на самом деле это двунаправленные отношения, я определил их однонаправленными, чтобы избежать последовательных каскадов. Таким образом, Clip имеет целочисленное свойство playlistId, а не ссылку на плейлист. Клип определен как часть списка воспроизведения, поэтому он не может существовать без него. Поэтому столбец «Playlist_ID» в БД определен не равным NULL и getPlayListId (). Я прочитал, что если я удаляю элемент из коллекции, каскад рассматривает его как удаление отношения, а не удаление объекта. В моем случае это проблема, поскольку каскад пытается установить нулевой столбец Playlist_ID и вызывает нарушение ограничения.

Я хочу код:
playlist.getClips () удалить (0). dao.update (список воспроизведения)
удалит клип. Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 01 января 2013

Если вы используете старую нотацию HBM inverse=true, она будет работать так, как вы хотите, чтобы она работала.Если вы используете аннотации Hibernate, новый способ сказать inverse=true состоит в том, чтобы использовать mappedBy на родительской стороне.

Добавьте поле элемента списка воспроизведения в объект Clip с соответствующими сопоставлениями.Если у вас есть аннотация @JoinColumn в вашей сущности Playlist, закомментируйте ее, и в вашей аннотации @OneToMany добавьте свойство mappedBy="whateverYourPlaylistVariableIsCalled"

, которое скажет Hibernate НЕ обновлять и ТОЛЬКО удалятькогда вы разрываете отношения.

1 голос
/ 08 марта 2012

Вы должны использовать orphanRemoval:

@Entity
public class Playlist {

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Clip> clips;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...