我的問題是關於JPA 2.0與Hibernate,@OneToOne關係和延遲加載。JPA 2.0/Hibernate:爲什麼用「@OneToOne」獲取LAZY可以開箱即用?
首先我的設置:
- 春3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- 的Hibernate 3.5.2決賽
- DBMS:在PostgreSQL 9.0
我最近遇到這樣一個事實,即@OneToOne關係不能以懶惰的方式獲取(FetchType.LAZY),至少不是沒有字節碼的工具n,編譯時間編織等。許多網站在那裏說這一點,例如:
- 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
的事情是,我的設置中,@OneToOne實體的延遲加載似乎工作「開箱即用」,我真的很想理解爲什麼。請看看我的單元測試:
@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"));
}
這個測試用例是成功的,並在Hibernate的SQL日誌輸出,我可以清楚地看到,該「avatarImage」會不會牽強,只是「用戶」 (只是一個單一的SELECT,JOIN沒有,到 「AvatarImage」 表等無法訪問)
User類單向@OneToOne relationshop看起來是這樣的:
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private AvatarImage avatarImage;
所以,一切都非常簡單 - 它似乎工作。
重複我的問題:爲什麼它工作,爲什麼可以懶惰地提取「AvatarImage」,雖然它是由@OneToOne關聯引用的?
我真的很感謝你可以提供的任何幫助
非常感謝!