Прежде всего, некоторые пояснения к ответу KLE :
Неограниченная (обнуляемая) взаимно-однозначная ассоциация является единственной, которую нельзя проксировать без инструментирования байт-кодом. Причина этого заключается в том, что объект-владелец ДОЛЖЕН знать, должно ли свойство ассоциации содержать прокси-объект или NULL, и он не может определить это, просматривая столбцы своей базовой таблицы из-за того, что один-к-одному обычно отображается через общий PK, поэтому в любом случае должен быть извлечен с нетерпением, делая прокси бессмысленным. Вот более подробное объяснение.
ассоциации многие-к-одному (и, очевидно, отношения один-ко-многим) не страдают от этой проблемы. Субъект-владелец может легко проверить свой собственный FK (и в случае «один ко многим» пустой прокси-сервер коллекции создается изначально и заполняется по требованию), поэтому связь может быть ленивой.
Замена один-к-одному на один-ко-многим никогда не бывает хорошей идеей. Вы можете заменить его уникальным «многие-к-одному», но есть и другие (возможно, лучшие) варианты.
Роб Х. имеет действительную точку, однако вы не сможете реализовать ее в зависимости от вашей модели (например, если ваша непосредственная ассоциация является обнуляемой).
Теперь, что касается исходного вопроса:
A) @ManyToOne(fetch=FetchType.LAZY)
должно работать просто отлично. Вы уверены, что он не перезаписывается в самом запросе? Можно указать join fetch
в HQL и / или явно установить режим выборки через Criteria API, который будет иметь приоритет над аннотацией класса. Если это не так, и у вас все еще есть проблемы, пожалуйста, опубликуйте ваши классы, запрос и полученный SQL для более подробного обсуждения.
B) @OneToOne
сложнее. Если это определенно не обнуляемо, воспользуйтесь предложением Роба Х. и укажите его так:
@OneToOne(optional = false, fetch = FetchType.LAZY)
В противном случае, если вы можете изменить свою базу данных (добавить столбец внешнего ключа в таблицу владельцев), сделайте это и сопоставьте ее как «присоединенную»:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
и в OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Если вы не можете этого сделать (и не можете жить с нетерпеливым извлечением), то инструментация байт-кода - ваш единственный выбор. Я должен согласиться с CPerkins , однако - если у вас есть 80 !!! объединений из-за активных ассоциаций OneToOne, у вас есть большие проблемы, тогда это: -)