簡體   English   中英

Hibernate FechType.LAZY不適用於復合@ManyToOne關系

[英]Hibernate FechType.LAZY not working for composite @ManyToOne relationships

沒有復合關系的@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表中只獲取一行並持續大約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。

我為我的實體添加一個額外的關系,性能提高了60倍......除了更改我的數據庫模型之外,還有什么方法可以讓懶惰的提取與復合關系一起工作嗎?

編輯:

在對此進行更詳細的研究之后,該問題與復合關系無關,而是通過任何未超過JPA / Hibernate定義的主鍵的關系。

因此,如果我有一個帶有標識列和自然唯一的表,以及通過其中一個或多個相關的各種表 - 我必須決定哪個是急於獲取的災難性的,並將另一個作為Hibernate的主鍵。

在相關表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...
}

如果同時你也有關系定位另一個字段(即自動增量標識字段),你必須決定哪個延遲提取將起作用...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM