JPA 2.0 / Hibernate и «orphanRemoval»: просто замена объекта не удаляет старый

У меня есть вопрос, касающийся JPA 2.0, Hibernate и "orphanRemoval".

Сначала моя установка:

Весна 3.0.5. ВЫПУСКSprnigData JPA 1.0.1. ВЫПУСКHibernate 3.5.2-FinalСУБД: PostgreSQL 9.0

У меня есть два довольно простых класса сущностей: «Пользователь» и «AvatarImage», «Пользователь» имеет «AvatarImage», и поэтому между «Пользователем» и «AvatarImage» существует связь.

В классе «Пользователь» свойство выглядит так:

// 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» раньше) не работает?

Я очень ценю любую помощь, которую вы можете предложить

Большое спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос