4

複合関係のない @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 の主キーとして配置する必要があります。 .

4

1 に答える 1

0

関連テーブル KontaktOsobe では、主キーは、関係を形成するコンポーネントで構成される @EmbeddedId である必要があります。

@Entity
@Table
public class KontaktOsobe{
    private KontaktOsobePK pk;

    @EmbeddedId
    public KontaktOsobePK getPk() {
        return pk;
    }
    // ... 
}

@Embeddable
public class KontaktOsobePK implements Serializable {
    private static final long serialVersionUID = 1L;

    private String sifraOsobe;
    private String partner;
    private String korisnik;

    // getters, setters, equals and hashode methods go here...
}

同時に、別のフィールド (つまり、自動インクリメンタル ID フィールド) をターゲットとするリレーションもある場合は、どの遅延フェッチが機能するかを決定する必要があります...

于 2013-02-08T13:47:23.840 に答える