繁体   English   中英

休眠:@ManyToOne(fetch = FetchType.LAZY) 对非主键引用列不起作用

[英]Hibernate: @ManyToOne(fetch = FetchType.LAZY) does not work on non-primary key referenced column

我有 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 条用于Order表的 SELECT 语句和一组用于Shipment的 SELECT 语句

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

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

尝试这个:

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

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

使用shipmentCode添加到您的实体字段并设置您的关系代码,然后它就很好

@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 提取实体而不使用关系值,那么当您尝试提取惰性实体时,Hibernate 找不到任何值,因为它没有关系值

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM