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

У меня вопрос относительно JPA 2.0, Hibernate и "orphanRemoval".

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

  • Spring 3.0.5.RELEASE
  • SprnigData JPA 1.0.1.RELEASE
  • Hibernate 3.5.2-Final
  • СУБД: PostgreSQL 9.0

У меня есть два довольно простых классы сущностей, «Пользователь» и «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» раньше)?

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

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

15
задан It's Leto 22 September 2011 в 06:20
поделиться