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ステートメントの束
optional = false
を指定する必要があります:
@OneToOne(optional = false, fetch = FetchType.LAZY)
または単に@ManyToOne
に変換します。
@ManyToOne(fetch = FetchType.LAZY)
注文の発送フィールドで@JsonIgnore
を使用できます。出荷フィールドでMappedBy
の使用を許可している場合は、それを削除すると問題が解決する可能性があります。
これを試して:
Criteria criteria = HibernateUtil.getSessionFactory()
.getCurrentSession()
.createCriteria(Order.class)
.setFetchMode("shipment", FetchMode.LAZY);