Tengo una pregunta con respecto a JPA 2.0, Hibernate y "orphanRemoval".JPA 2.0/Hibernate y "orphanRemoval": el solo reemplazo de una entidad no elimina el anterior
En primer lugar mi configuración:
- primavera 3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- Hibernate 3.5.2 de final
- DBMS PostgreSQL 9.0:
Tengo dos clases de entidades bastante simples, "Usuario" y "Imagen de Avatar", Un "Usuario" tiene una "Imagen de Avatar", y así entre "Usuario" y "Imagen de Avatar" existe la relación ioneship.
En la categoría "Usuario", la propiedad tiene el siguiente aspecto:
// class "User"
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
private AvatarImage avatarImage;
Eso quiere decir que, si la propiedad "avatarImage" se establece en cero, la referencia entre el "usuario" y "AvatarImage" es eliminado y el mecanismo "orphanRemoval" eliminará la "avatarImage" de la base de datos (corrígeme si me equivoco).
Así que cuando actualizo el "avatarImage" para un determinado usuario, actualmente tengo que escribir esto:
user.setAvatarImage(null); // First set it to null
userRepository.save(user); // Now "orphanRemoval" will delete the old one
user.setAvatarImage(theNewAvatarImage);
userRepository.save(user);
Así establecer la propiedad "avatarImage" primero en nulo, salvando el "usuario", y luego establece la nueva Imagen de Avatar "theNewAvatarImage", nuevamente guardando al usuario.
Esta es la única forma en que actualmente funciona para mí: el "huérfano Removimiento" eliminará el antiguo "avatarImage" al establecerlo en "nulo" y luego guardar al usuario.
Pero, yo habría pensado que este código también debería funcionar:
user.setAvatarImage(theNewAvatarImage);
userRepository.save(user);
Así Omito establecimiento de la "avatarImage" a "nulo", pero sólo la creación de "theNewAvatarImage", en sustitución del antiguo "avatarImage". Pero esto no funciona, el viejo AvatarImage no se elimina de la base de datos al comprometer la transacción.
¿Alguien sabe por qué el segundo código (simplemente reemplazando AvatarImage sin establecerlo antes como "nulo") no funciona?
Realmente aprecio la ayuda que puede ofrecer
Muchas gracias!