複合関係のない @ManyToOne 関係は問題なく機能します。
@Entity
@Table
public class Telefoni{
... other fields not included for simplicity sake
private DjecaRoditelja djecaRoditelja;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDDjeteta", referencedColumnName = "IDDjeteta")
public DjecaRoditelja getDjecaRoditelja() {
return this.djecaRoditelja;
}
public void setDjecaRoditelja(DjecaRoditelja djecaRoditelja) {
this.djecaRoditelja = djecaRoditelja;
}
}
...
// in some DAO method
tel = entityManager.find(Telefoni.class, primaryKey);
これにより、1 つの SQL クエリが実行され、Telefoni テーブルから 1 行だけがフェッチされ、約 10 ミリ秒続きます。
ただし、複合 @JoinColumns を使用して @ManyToOne 関係を追加すると、遅延フェッチが機能しなくなります。
@Entity
@Table
public class Telefoni{
... other fields not included for simplicity sake
private KontaktOsobe kontaktOsobe;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "KORISNIK", referencedColumnName = "korisnik"),
@JoinColumn(name = "PARTNER", referencedColumnName = "Partner"),
@JoinColumn(name = "SifraKonOs", referencedColumnName = "SifraOsobe") })
public KontaktOsobe getKontaktOsobe() {
return this.kontaktOsobe;
}
public void setKontaktOsobe(KontaktOsobe kontaktOsobe) {
this.kontaktOsobe = kontaktOsobe;
}
}
...
// in some DAO method
tel = entityManager.find(Telefoni.class, primaryKey);
これは、すべての関係が解決されるまで、すべての親エンティティとすべての親の親を熱心にフェッチする 37 の SQL クエリを実行します。これは約 600ms 続きます。
エンティティにリレーションを 1 つ追加すると、パフォーマンスが 60 倍悪くなります... データベース モデルを変更する以外に、レイジー フェッチを複合リレーションで動作させる方法はありますか?
編集:
これをより詳細に調査した後、問題は複合関係とは関係ありませんが、関係は JPA/Hibernate で定義された主キーを超えていません。
したがって、ID 列と自然な一意のテーブル、およびいずれかを介して関連するさまざまなテーブルがある場合、熱心にフェッチする方が壊滅的ではないものを決定し、もう一方を Hibernate の主キーとして配置する必要があります。 .