当前位置: 首页 > 知识库问答 >
问题:

Hibernate FechType。懒惰不适用于复合@ManyToOne关系

龙永思
2023-03-14

@没有复合关系的多通关系可以正常工作:

@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);

这执行1SQL查询,仅从Telefoni表中获取一行,持续约10ms。

但是,当添加任何带有复合@JoinColumns的@manytone关系时,延迟抓取将停止工作:

@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的主键。

共有1个答案

高英彦
2023-03-14

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

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

 类似资料:
  • 在Raku文档中,说明了收集-获取构造被延迟计算。在下面的示例中,我很难总结出构造的懒惰: 为什么我们在行为上有区别?尽管我们尝试做同样的事情:以懒惰的方式为数组分配Seq 有人能澄清一下这件事吗???

  • 问题内容: 我正在使用Hibernate3.3.1,我想在人员和指定公司之间建立关系。他们应该松耦合,但我想安排通过级联创建公司,而不是显式调用saveOrUpdate(newCompany)。 我定义了以下实体: 在我的小岛内,我正在执行以下操作: 我得到一个例外 org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例- 在刷新之前保存该瞬态

  • 问题内容: 我的问题很简单,如何使这段代码变得懒惰: 上面的代码可以计算组合,但是可以在内存中创建整个数组数组。我需要让它返回类似的东西,除了Swift类型系统不允许我做一些通用的事情。 有什么想法如何实现这一目标并保持功能风格吗? 附注:我确实想过用生成器解决这个问题并跟踪索引的另一种方法,但是我不想跟踪任何状态,我想要一个纯函数式(如FP中)的解决方案。Haskell默认情况下会这样做,顺便说

  • 问题内容: 在我们正在开发的此应用程序中,我们注意到一个视图特别慢。我剖析了该视图,并注意到,即使数据库中只有两个对象要获取,也执行了一个查询,该查询花费了10秒。所有和关系都是懒惰的,所以这不是问题。在检查实际执行的SQL时,我注意到查询中有80多个联接。 在进一步检查该问题时,我注意到该问题是由实体类的深入层次结构和实体类之间的关系引起的。所以,我想,我只是让它们变得懒惰,应该可以解决问题。但

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 我正在使用“浏览”检查我的代码。Pylint返回了关于我的调试消息的日志记录不懒惰警告。 我的代码是: 如何修复pylint中的logging not lazy?