- Sim,
@BatchSize
deve ser usado com associações preguiçosas. - O Hibernate executará várias instruções na maioria das situações de qualquer maneira, mesmo se a contagem de proxies/coleções não inicializadas for menor que o tamanho do lote especificado. Veja esta resposta para mais detalhes. Além disso, consultas mais leves em comparação com consultas menos grandes podem contribuir positivamente para a taxa de transferência geral do sistema.
@BatchSize
no nível de classe significa que o tamanho do lote especificado para a entidade será aplicado a todos os@*ToOne
associações preguiçosas com essa entidade. Veja o exemplo com aPerson
entidade na documentação.
As perguntas/respostas vinculadas que você forneceu estão mais preocupadas com a necessidade de otimização e carregamento lento em geral. Eles também se aplicam aqui, é claro, mas não estão relacionados apenas ao carregamento em lote, que é apenas uma das abordagens possíveis.
Outra coisa importante está relacionada ao carregamento antecipado, mencionado nas respostas vinculadas e que sugere que, se uma propriedade sempre for usada, você poderá obter um desempenho melhor usando o carregamento antecipado. Em geral, isso não é verdade para coleções e em muitas situações para associações a um.
Por exemplo, suponha que você tenha a seguinte entidade para a qual
bs
e cs
são sempre usado quando A
é usado. public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
Carregando ansiosamente
bs
e cs
obviamente sofre com o problema de seleções N + 1 se você não as juntar em uma única consulta. Mas se você juntá-los em uma única consulta, por exemplo, como:select a from A
left join fetch a.bs
left join fetch a.cs
então você cria produto cartesiano completo entre
bs
e cs
e retornando count(a.bs) x count(a.cs)
linhas no conjunto de resultados para cada a
que são lidos um por um e montados nas entidades de A
e suas coleções de bs
e cs
. A busca em lote seria muito ideal nesta situação, porque primeiro você leria
A
s, então bs
e então cs
, resultando em mais consultas, mas com muito menos quantidade total de dados que são transferidos do banco de dados. Além disso, as consultas separadas são muito mais simples do que uma grande com junções e são mais fáceis para o banco de dados executar e otimizar.