мой вопрос касается JPA 2.0 с Hibernate, отношениями @OneToOne и отложенной загрузкой.
Сначала мои настройки:
- Spring 3.0.5.RELEASE
- SprnigData JPA 1.0.1. РЕЛИЗ
- Hibernate 3.5.2-Final
- СУБД: PostgreSQL 9.0
Недавно я столкнулся с тем фактом, что отношение @OneToOne не может быть получено ленивым способом (FetchType.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" ) );
}
Этот тестовый пример успешен, и в выводе журнала SQL Hibernates я ясно вижу, что «avatarImage» не будет выбираться, только «пользователь» (только один SELECT, нет JOIN, нет доступа к » Таблица "AvatarImage" и т. Д.)
Однонаправленный магазин отношений @OneToOne в классе User выглядит следующим образом:
@OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private AvatarImage avatarImage;
Итак, все очень просто - и, кажется, работает.
Повторяю мой вопрос: почему он работает, почему "AvatarImage" может быть извлечен лениво, хотя на него ссылается ассоциация @OneToOne?
Я очень ценю любую помощь, которую вы можете предложить
Большое спасибо!