У меня есть следующие объекты:@OneToOne ассоциация не может быть с готовностью загружена в запросе
//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
Однако, если я делаю одно из следующих действий, новый SELECT
создается для каждого Baz
, чтобы получить соответствующий 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
имеет проблемы с отложенной загрузки, поэтому я последовал их совету и добавил опциональный = ЛОЖЬ (который, похоже, не много сделать для меня).
Я также попробовал предложение 3 из this blogpost, но это, кажется, не имеют никакого эффекта ..
Любые предложения, как жадно извлечения графа объекта, чтобы избежать ВЫБЕРИТЕ п + 1 вопрос?
Я использую EJB 3 (JPA 1) с Hibernate 3.2.4.sp1 на сервере JBoss 4.2.
ПРИМЕЧАНИЕ. Это несколько похоже на один из моих previous questions. Разница в том, что здесь Baz
ссылается на Bar
, что, по-видимому, является проблемой.