web-dev-qa-db-ja.com

Hibernate:@ManyToOne(fetch = FetchType.LAZY)が非主キー参照列で機能しない

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クエリが表示されました)。ただし、ShipmentOrderと一緒にフェッチしないで、遅延ロードする必要があります。

他のテーブルでは、参照される列が主キーの場合、結果は期待どおりです(遅延読み込みが使用されます)。私の場合、ShipmentCodeShipmentテーブルの主キーではなく、遅延読み込みはHibernateでは使用されません。

その目標を達成する方法を教えてもらえますか?

編集:クエリコードは次のとおりです。

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

SQLクエリは次のとおりです。1つのOrderテーブルのSELECTステートメントとShipmentのSELECTステートメントの束

18
Nghia Le

optional = falseを指定する必要があります:

@OneToOne(optional = false, fetch = FetchType.LAZY)

または単に@ManyToOneに変換します。

@ManyToOne(fetch = FetchType.LAZY)
1
Vlad Mihalcea

注文の発送フィールドで@JsonIgnoreを使用できます。出荷フィールドでMappedByの使用を許可している場合は、それを削除すると問題が解決する可能性があります。

0
Syam Dorjee

これを試して:

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