关于java:休眠:@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字段,如下所示:

1
2
3
@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不使用延迟加载。

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

编辑:
查询代码如下:

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

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


使用shipmentCode将其添加到您的实体字段,并设置您的关联代码,然后将其分

1
2
3
4
5
6
@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时将找不到任何值,因为它没有相关值


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

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


您可以在订单的装运字段上使用@JsonIgnore。 如果您要在发货字段中使用MappedBy,则将其删除可能会解决您的问题。


试试这个:

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