У меня есть очень специфический вопрос из двух частей, который я действительно очень надеюсь, что раньше его не задавали:)
Сначала контекст
У меня есть несколько компонентов Hibernate с ленивыми ассоциациями между нимитакие как:
@Entity
public class SalesData {
@ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(nullable = false)
public Product getProduct() {
return product;
}
}
, а затем:
@Entity
public class Product {
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public Set<SoundRecording> getSoundRecordings() {
return soundRecordings;
}
}
и, наконец,
@Entity public class SoundRecording {
}
Теперь, если я сделаю запрос Criteria, где я добавлю псевдонимы дляОтношение SalesData к Product, а затем для Product to SoundRecording, например:
Criteria criteria = session.createCriteria(SalesData.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createAlias("product", "p");
criteria.createAlias("p.soundRecordings", "s");
Я вижу в журнале Hibernate, что он генерирует SQL, например:
select ... from SalesData this_
inner join Product p1_ on this_.product_id=p1_.id
inner join SoundRecording s5_ on p1_.id=s5_.product_id
where ...
, когда я вызываю критерии.list () именно то, что я хочуОднако, если я сделаю:
salesDatas.getProduct().getSoundRecordings(0);
, в журнале я вижу, что Hibernate сделал еще один конкретный запрос выбора SQL, чтобы восстановить эту связь:
select ... from SoundRecording soundrecor0_ where soundrecor0_.product_id=?
Тогда мой вопрос:
Это нормально?Моя цель здесь - загрузить одним выстрелом (одним SQL-запросом) все, что мне нужно, чтобы избежать этих n + 1 выборов.Я думал, что использование псевдонима - один из способов сделать это, тем более что я ясно вижу, что его генерирует внутреннее соединение между таблицами.Если я использую explictit fetchMode (Join), то hibernate не будет выдавать все дополнительные выборки, он будет удовлетворен первоначальным выбором со многими (внешними) объединениями.Почему же это не относится к объединениям, генерируемым псевдонимами?