休眠:@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一起获取.

对于其他表,如果引用的列是主键,则结果符合预期(使用延迟加载)。就我而言,ShipmentCode不是Shipment表的主键,Hibernate 不使用延迟加载。

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

编辑:查询代码如下:

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

SQL 查询是:1 个 SELECT 语句用于Order表和一堆 SELECT 语句用于Shipment

>Thd 问题是由 HHH-13024 问题引起的。

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

如果您担心加载时有多个选择查询,则可以使用实体图来解决此问题。 请参阅以下链接了解更多详情https://www.baeldung.com/spring-data-jpa-named-entity-graphs

试试这个:

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

您可以在订单的发货字段中使用@JsonIgnore。如果您要在货件字段中使用MappedBy,那么删除它可能会解决您的问题。

使用 shippingCode 添加到您的实体字段并设置您的关系代码,然后就可以分叉了

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

如果您使用 Lazy-init 您的实体提取而没有带有关系值的 fild,那么当您尝试提取懒惰实体 Hibernate 找不到任何值时,它没有关系值

最新更新