簡體   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