【问题标题】:Hibernate: @ManyToOne(fetch = FetchType.LAZY) does not work on non-primary key referenced columnHibernate:@ManyToOne(fetch = FetchType.LAZY) 不适用于非主键引用的列
【发布时间】:2015-03-07 10:22:05
【问题描述】:

我有 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 查询是:Order 表的 1 个 SELECT 语句和Shipment 的一堆 SELECT 语句

【问题讨论】:

  • 您能显示触发条件或查询的代码吗?
  • 您可以尝试使用原生查询,例如 select * from order where 条件。

标签: java hibernate jpa lazy-loading one-to-one


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我已经尝试过你的解决方案,但结果是一样的
  • 我也用你更新的答案进行了测试,但结果还是一样。
  • 我同意这一点。查看此帖子了解更多详情 (stackoverflow.com/questions/17987638/…)
【解决方案2】:

试试这个:

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

【讨论】:

  • 请为您的解决方案添加解释
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    使用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 找不到任何值,因为它没有关系值

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 2020-11-02
        相关资源
        最近更新 更多