mi pregunta es sobre JPA 2.0 con Hibernate, las relaciones @OneToOne y la carga diferida.JPA 2.0/Hibernate: ¿Por qué la recuperación de LAZY con "@OneToOne" funciona de la caja?
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:
Recientemente me encontré con el hecho de que una relación @OneToOne no se puede obtener de forma perezosa (FetchType.LAZY), al menos no sin la instrumentación del código de bytes n, compilar tejido de tiempo o similar. Muchos sitios por ahí dicen que esto, por ejemplo:
- http://community.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one
- http://justonjava.blogspot.com/2010/09/lazy-one-to-one-and-one-to-many.html
- Making a OneToOne-relation lazy
La cosa es que, con mi configuración, una carga lenta de una entidad @OneToOne parece funcionar "fuera de la caja", y realmente me gustaría entender por qué. Por favor, eche un vistazo a mi unidad de prueba:
@Test
@Transactional
public void testAvatarImageLazyFetching()
{
User user = new User();
user.setAvatarImage(new AvatarImage());
User = userRepository.save(user);
entityManager.flush();
entityManager.clear();
User loadedUser = userRepository.findOne(user.getId());
assertNotNull(loadedUser);
PersistenceUtil persistenceUtil = Persistence.getPersistenceUtil();
assertTrue(persistenceUtil.isLoaded(loadedUser));
assertFalse(persistenceUtil.isLoaded(loadedUser, "avatarImage"));
}
Este caso prueba es satisfactoria, y en hiberna salida de registro de SQL, puedo ver claramente, que el "avatarImage" no va a ser exagerado, sólo el "usuario" (un solo SELECT, sin JOIN, no tiene acceso a la "AvatarImage" mesa, etc.)
el relationshop @OneToOne unidireccional en la clase de usuario tiene el siguiente aspecto:
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private AvatarImage avatarImage;
lo tanto, todo muy simple - Y parece funcionar.
Para repetir mi pregunta: ¿por qué está funcionando? ¿Por qué se puede buscar "AvatarImage" de forma perezosa, aunque se hace referencia a ella con una asociación @OneToOne?
Realmente aprecio la ayuda que puede ofrecer
Muchas gracias!