Java Hibernate:@ManyToOne(fetch=FetchType.LAZY)对非主键引用的列不起作用
我有两个表:Java Hibernate:@ManyToOne(fetch=FetchType.LAZY)对非主键引用的列不起作用,java,hibernate,jpa,lazy-loading,one-to-one,Java,Hibernate,Jpa,Lazy Loading,One To One,我有两个表:Order[OrderId(PK),OrderShipmentCode,…]和ShipmentId(PK),ShipmentCode,…] 在Order类中,我声明shipping字段如下: @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = fa
Order[OrderId(PK),OrderShipmentCode,…]
和ShipmentId(PK),ShipmentCode,…]
在Order
类中,我声明shipping
字段如下:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false)
private Shipment shipment;
当我得到订单
列表时,发货
也被加载(我看到了许多单独的SELECT查询)。但是我希望发货
是延迟加载的,而不是与订单
一起提取
对于其他表,如果引用的列是主键,则结果与预期一致(使用延迟加载)。在我的例子中,ShipmentCode
不是shipping
表的主键,Hibernate不使用延迟加载
你能告诉我如何实现这个目标吗
编辑:
查询代码如下:
Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class);
List result = criteria.list();
SQL查询是:1个SELECT语句用于
订单
表,一组SELECT语句用于装运
问题是由
本着OSS的真正精神,您可能希望调查问题并发送一个包含修复建议的Pull请求。这是解决问题的最快方法。试试以下方法:
Criteria criteria = HibernateUtil.getSessionFactory()
.getCurrentSession()
.createCriteria(Order.class)
.setFetchMode("shipment", FetchMode.LAZY);
您可以在订单的装运字段上使用
@JsonIgnore
。如果您正在使用MappedBy
over shipping字段进行发送,那么删除它可能会解决您的问题 使用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进行实体提取,而不使用关系值fild,那么当您尝试提取Lazy实体时,Hibernate找不到任何值,因为它没有关系值如果您在加载时担心多个select查询,您可以通过使用实体图来克服这一问题。请参考以下链接了解更多详细信息
能否显示被激发的条件或查询的代码?您可以尝试使用本机查询,如select*from order where condition。谢谢。我已经尝试了你的解决方案,但结果是sameI也用你更新的答案进行了测试,但结果仍然是一样的。我同意这一点。查看此帖子了解更多详细信息()请为您的解决方案添加解释