O que este metódo faz ?
Quando devo utilizar ele ?
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.