la mia domanda riguarda JPA 2.0 con Hibernate, @OneToOne e il caricamento lazy.JPA 2.0/Hibernate: Perché il caricamento di LAZY con "@OneToOne" funziona senza problemi?
Prima la mia configurazione:
- Primavera 3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- Hibernate 3.5.2-finali
- DBMS: PostgreSQL 9.0
Recentemente mi sono imbattuto nel fatto che una relazione @OneToOne non può essere recuperata in modo lazy (FetchType.LAZY), almeno non senza byte instrumentatio n, compilare la tessitura del tempo o simili. Molti siti là fuori dicono che questo, ad esempio:
- 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
Il fatto è che, con la mia messa a punto, un lazy loading di un'entità @OneToOne sembra funzionare "out of the box", e mi piacerebbe davvero capire perché. Si prega, dare un'occhiata al mio test di unità:
@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"));
}
Questo caso prova è riuscita, e in Hibernates output della registrazione SQL, posso vedere chiaramente, che il "avatarImage" non sarà recuperato, solo il "utente" (solo un singolo SELECT, nessun JOIN, non ha accesso al "AvatarImage" tavolo etc.)
il @OneToOne proficua relazione unidirezionale nella classe utente si presenta così:
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private AvatarImage avatarImage;
Quindi, tutto molto semplice - e sembra funzionare.
Per ripetere la mia domanda: perché funziona, perché è possibile recuperare pigramente l '"AvatarImage", sebbene venga fatto riferimento a un'associazione @OneToOne?
Apprezzo molto tutto l'aiuto che si può offrire
Grazie mille!