gpt4 book ai didi

java - @OneToOne 关联无法在查询中急切加载

转载 作者:行者123 更新时间:2023-12-01 04:39:37 26 4
gpt4 key购买 nike

我有以下实体:

//The class Entity is a @MappedSuperclass with id, audit fields, equals and so on.
@Entity
public class Foo extends Entity {
@OneToMany(mappedBy = "foo", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Bar> bars = new HashSet<Bar>; // + getter/setter

// ... other properties
}

@Entity
public class Bar extends Entity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "foo_id")
private Foo foo; // +getter/setter

@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "baz_id", nullable = false)
private Baz baz; // + getter/setter

// ... other properties
}

@Entity
public class Baz extends Entity {
@OneToOne(mappedBy = "baz", fetch = FetchType.LAZY, optional = false)
private Bar bar; // + getter/setter

// ... other properties
}

现在,如果我使用以下内容加载一个 Bar ,一切都很好(即只有一个查询发送到数据库):

SELECT bar FROM Bar bar LEFT JOIN FETCH bar.baz WHERE bar.id = :barId

但是,如果我执行以下任一操作,则会为每个 Baz 创建一个新的 SELECT 以获取关联的 Bar 对象:

SELECT f FROM Foo f LEFT JOIN FETCH f.bars bar LEFT JOIN FETCH bar.baz WHERE f.id = :fooId
SELECT f FROM Foo f LEFT JOIN FETCH f.bars bar LEFT JOIN FETCH bar.baz baz LEFT JOIN FETCH baz.bar WHERE f.id = :fooId

输出为:

10:52:08,622 INFO  [STDOUT] Hibernate: select ... from Foo ...
10:52:08,698 INFO [STDOUT] Hibernate: select ... from Bar where baz_id=?
10:52:08,711 INFO [STDOUT] Hibernate: select ... from Bar where baz_id=?
... and so on

现在,我从 this answer 了解到 @OneToOne 在延迟加载方面存在问题,因此我听从了他们的建议并添加了 optional = false (这对我来说似乎没有多大作用)。

我也尝试了 this blogpost 的建议 3,但这似乎根本没有效果..

有什么建议如何快速获取对象图以避免 SELECT n+1 问题吗?

我在 JBoss 4.2 服务器上使用 EJB 3 (JPA 1) 和 Hibernate 3.2.4.sp1。

注意:这有点类似于我的 previous questions 之一。不同之处在于,这里 Baz 有一个对 Bar 的引用,这似乎是问题所在。

最佳答案

我能够通过删除从 Baz 到 Bar 的反向引用来解决这个问题。我没有找到根本原因,也没有找到无需额外选择即可急切加载对象的方法。

关于java - @OneToOne 关联无法在查询中急切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16769968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com