Hibernate.initialize

O que este metódo faz ?

Quando devo utilizar ele ?

Uma pequena pesquisa e você encontraria o javadoc do cara.
Em resumo: Force initialization of a proxy or persistent collection.

Então, já pesquisei. Já li. Mas não entendi muito. Por isto perguntei…

Como você deve ter lido na documentação, o objetivo deste método é forçar a inicialização de algo que foi obtido em um select (find, get ou etc) pelo hibernante.
Como você pode ter mapeado algum atributo como LAZY, este método forçaria a realizar o(s) select(s) para obter o(s) atributo(s) que não foram carregados inicialmente.
Porém, se você tem uma estrutura onde A, B e C são classes distintas e A contém B e B contém C, ao executar o initialize, em um objeto de A, apenas o objeto de B será carregado, não o de C (se o objeto de C está como LAZY em B, se estiver como EAGER, isso não conta).
Basicamente, o initialize é uma gambiarra oficial para substituir coisas como o OpenSessionInView

Correto. Isto eu entendi.

Mas pelo que entendi, neste seu exemplo, para carregar o C, tenho que carregar o B primeiro correto ?

Seria assim:

Sendo que a, fez uma consulta no banco.

Hibernate.initialize(a);
Hibernate.initialize(a.b);
Hibernate.initialize(b.c);

É isto ?

Acho que ficaria um pouco diferente e, penso eu, não sei qual o benefício de fazer isso até todos os níveis (já vi encadeamentos com 5, 6 níveis, isso seria, realmente, útil?

Hibernate.initialize(a);
Hibernate.initialize(a.b);
Hibernate.initialize(a.b.c);

Então, pergunto isto porque vi em um sistema que estou dando manutenção e não entendi direito, por isto perguntei.

Por exemplo neste sistema que estou analisando, está tipo assim:

Hibernate.initialize(a);
Hibernate.initialize(a.b);
Hibernate.initialize(a.b.c);
Hibernate.initialize(a.b.c.d);
Hibernate.initialize(a.b.c.d.e); - neste ponto da o erro, pois não carregou o d. Mas ao fazer uma consulta no banco de dados pelo sistema ele carrega o e.

Já que está dando erro e vai ter que mexer, aproveita pra retirar essas gambiarras e usar HQL.

Então o correto não é usar isto ?

Nao é correto (eficiente) se isto estiver gerando n SQLs ao invés 1 com joins pra atender o resultado pro usuário.