Прежде всего, некоторые пояснения к ответу KLE :
Неограниченная (обнуляемая) взаимно-однозначная ассоциация является единственной, которую нельзя проксировать без инструментирования байт-кодом. Причина этого заключается в том, что объект-владелец ДОЛЖЕН знать, должно ли свойство ассоциации содержать прокси-объект или NULL, и он не может определить это, просматривая столбцы своей базовой таблицы из-за того, что один-к-одному обычно сопоставляют через общий PK, поэтому в любом случае должен быть извлечен с нетерпением, делая прокси бессмысленным. Вот более подробное объяснение.
ассоциации многие-к-одному (и, очевидно, один-ко-многим) не страдают от этой проблемы. Субъект-владелец может легко проверить свой собственный FK (и в случае «один ко многим» пустой прокси-сервер коллекции создается изначально и заполняется по требованию), поэтому сопоставление может быть ленивым.
Замена один-к-одному на один-ко-многим никогда не бывает хорошей идеей. Вы можете заменить его уникальным много-к-одному, но есть и другие (возможно, лучшие) варианты.
Роб Х. имеет действительную точку, однако , вы не можете быть в состоянии осуществить это в зависимости от модели (например , если ваш один-к-одному ассоциации является обнуляемым).
Теперь, что касается оригинального вопроса:
А) @ManyToOne(fetch=FetchType.LAZY)
должно работать просто отлично. Вы уверены, что он не перезаписывается в самом запросе? Можно указать join fetch
в HQL и / или явно установить режим выборки через Criteria API, который будет иметь приоритет над аннотацией класса. Если это не так, и у вас все еще есть проблемы, пожалуйста, опубликуйте ваши классы, запрос и полученный SQL для более подробного обсуждения.
Б) @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, у вас есть большие проблемы, чем это :-)
one-to-one
с формулой, какselect other_entity.id from other_entity where id = other_entity.id
. Конечно, это не идеально для выполнения запросов.