休眠:@ManyToOne(fetch = FetchType.LAZY)不适用于非主键引用的列

2022-09-01 17:55:12

我有2张桌子:和。Order [OrderId(PK), OrderShipmentCode, ...]Shipment[ShipmentId(PK), ShipmentCode, ...]

在课堂上,我声明了如下字段:Ordershipment

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

当我得到的列表时,也加载了(我看到许多单独的SELECT查询)。但是我希望延迟加载,而不是与 一起获取。OrderShipmentShipmentOrder

对于其他表,如果引用的列是主键,则结果符合预期(使用延迟加载)。在我的情况下,不是表的主键,并且休眠不使用延迟加载。ShipmentCodeShipment

你能告诉我如何实现这个目标吗?

编辑:查询代码如下:

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

SQL 查询包括:1 个用于表的 SELECT 语句和一堆用于OrderShipment


答案 1

THD 问题是由 HHH-13024 问题引起的。

本着 OSS 的真正精神,您可能希望调查问题并发送包含修复建议的拉取请求。这是解决问题的最快方法。


答案 2

试试这个:

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

推荐