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 表中获取一行并持续约 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 查询,急切地获取每个父实体和每个父实体的父实体,直到它解决所有关系。这将持续大约 600 毫秒。

为我的实体添加一个额外的关系,我的性能降低了 60 倍......除了更改我的数据库模型之外,还有什么方法可以让懒惰的获取与复合关系一起工作?

编辑:

在对此进行了更详细的调查之后,该问题与复合关系无关,而是通过任何不超过 JPA/Hibernate 定义的主键的关系。

因此,如果我有一个具有标识列和自然唯一性的表,以及通过一个或另一个相关的各种表 - 我必须决定急切获取哪个灾难性较小,并将另一个作为 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...
}

如果同时您还具有针对另一个字段(即自动增量身份字段)的关系,您必须决定哪个延迟获取将起作用......

于 2013-02-08T13:47:23.840 回答