Спящий режим: @ManyToOne (fetch = FetchType.LAZY) не работает с столбцом с непервичным ключом

У меня есть 2 таблицы: Order [OrderId(PK), OrderShipmentCode, ...] и Shipment[ShipmentId(PK), ShipmentCode, ...].

В классе Order я объявил shipment поле следующим образом:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false)
private Shipment shipment;

Когда я получаю список Order, загружается shipment (я видел много отдельных запросов SELECT). Но я хочу, чтобы shipment был ленивым загруженным, а не с Order.

Для других таблиц, если ссылочный столбец является первичным ключом, результаты будут такими же ожидаемыми (используется Lazy-load). В моем случае ShipmentCode не является основным ключом таблицы shipment, а ленивая загрузка не используется Hibernate.

Не могли бы вы показать мне, как достичь этой цели?

EDIT: Код запроса выглядит следующим образом:

Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class);
List result = criteria.list();

SQL-запросы: 1 инструкция SELECT для таблицы Order и куча инструкции SELECT для shipment

Ответ 1

Вам нужно указать optional = false:

@OneToOne(optional = false, fetch = FetchType.LAZY)

или просто превратите его в @ManyToOne:

@ManyToOne(fetch = FetchType.LAZY)

Ответ 2

Попробуйте следующее:

Criteria criteria = HibernateUtil.getSessionFactory()
                                 .getCurrentSession()
                                 .createCriteria(Order.class)
                                 .setFetchMode("shipment", FetchMode.LAZY);