没有复合关系的@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 的主键.