[英]Hibernate with Kotlin: @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.