2013-05-27 2 views
1

У меня есть следующие объекты:@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, что, по-видимому, является проблемой.

ответ

0

Я смог обойти проблему, удалив обратную ссылку от База до Бар. Я не нашел основную причину или способ загружать объекты с нетерпением без дополнительных выборок.