По-перше, кілька роз'яснень відповіді KLE :
Нестримне (зведене) асоціація один на один - це єдине, яке не може бути проксифіковано без інструментів байт-коду. Причиною цього є те, що суб'єкт власника ПОВИНЕН знати, чи має властивість асоціації містити проксі-об'єкт або NULL, і він не може визначити, дивлячись на стовпці базової таблиці через те, що один-на-один зазвичай відображається через спільний ПК, так що все одно має бути нетерплячим, що робить проксі безглуздим. Ось більш детальне пояснення.
багато асоціацій (і, очевидно, один) багатьом не страждають від цього питання. Організація-власник може легко перевірити свій власний ФК (а у випадку, коли їх багато хто, спочатку проксі-сервер колекції створюється та заповнюється на вимогу), тому асоціація може бути лінивою.
Заміна одного на одного на одного - багатьом - це майже ніколи не є хорошою ідеєю. Ви можете замінити його на унікальні багато в одному, але є й інші (можливо, кращі) варіанти.
Роб Х. має дійсну точку, однак, можливо, ви не зможете реалізувати це залежно від вашої моделі (наприклад, якщо ваша асоціація один на один є нульовою).
Тепер, що стосується оригінального питання:
А) @ManyToOne(fetch=FetchType.LAZY)
повинен працювати просто чудово. Ви впевнені, що це не перезаписано в самому запиті? Можливо вказати join fetch
в HQL та / або явно встановити режим отримання за допомогою 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
. Звичайно, це не ідеально для виконання запитів.