У меня вопрос относительно JPA 2.0, Hibernate и "orphanRemoval".
Сначала моя установка:
У меня есть два довольно простых классы сущностей, «Пользователь» и «AvatarImage», «Пользователь» имеет «AvatarImage», и поэтому между «User» и «AvatarImage» существует связь.
В классе «User» свойство выглядит следующим образом:
// class "User"
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
private AvatarImage avatarImage;
Это означает, что если для свойства «avatarImage» установлено значение null, ссылка между «User» и «AvatarImage» удаляется и «orphanRemoval» механизм удалит "avatarImage" из базы данных (поправьте меня, если я ошибаюсь).
Итак, когда я обновляю «avatarImage» для определенного пользователя, мне сейчас нужно написать следующее:
user.setAvatarImage( null ); // First set it to null
userRepository.save( user ); // Now "orphanRemoval" will delete the old one
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
Итак, сначала установив для свойства «avatarImage» значение null, сохранив «user», а затем установив новое AvatarImage » theNewAvatarImage ", снова спасая пользователя.
Это единственный способ, которым это сейчас работает для меня - «orphanRemoval» удалит старый «avatarImage», установив для него значение «null» и затем сохранив пользователя.
Но я бы подумал, что этот код также должен работать:
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
Поэтому я опускаю установку «avatarImage» на «null», а просто устанавливаю «theNewAvatarImage», заменяя старый «avatarImage».Но это не работает, старый AvatarImage не удаляется из базы данных при фиксации транзакции.
Кто-нибудь знает, почему не работает второй код (просто заменяющий AvatarImage без установки его на «null» раньше)?
Я очень признателен за любую помощь, которую вы можете предложить
Большое спасибо!