Olá pessoal,
Eu acho o Hibernate um framework ORM fenomenal, na verdade o melhor até o momento na minha humilde opnião, mas tenho algumas dúvidas sobre o seu funcionamento.
Existe um problema com Lazy Loading que já vi muita gente questionando e nenhuma solução realmente elegante, que é o problema de objeto detached da hibernate session quando esse objeto atravessa uma requisição web. Por exemplo, na requisição A eu carrego o objeto A e quando o web server enviar a resposta ao cliente a hibernate session será fechada, sendo que esse objeto A ficou guardado na http session ou algo equivalente, e quando na requisição B eu tentar acessar um lazy object eu vou tomar uma exceção “failed to lazily initialize a collection…: …no session or session was closed”.
Isso é fácil de entender, a hibernate session a qual o objeto A estava ligado foi fechada e agora ele não tem mais como se comunicar com o banco, a não ser que eu o realoque numa hibernate session nova(o que pode me acarretar outros problemas). Aí vem minha dúvida, o pessoal da Hibernate Team ao invés de sempre lançar uma exception não poderia colocar uma configuração que ao tentar acessar um lazy object, que pertence a um objeto desalocado de uma sessão ativa, criasse uma sessão trouxesse as informações e fechasse a sessão em seguida?
Com certeza devem haver muitos problemas em se fazer isso já que o pessoal do Hibernate não o fez assim, mas eu não consigo ver esses problemas, vocês saberiam o por que sempre lançar uma exception?
Já muitos exemplos de DAOs implementados com hibernate onde para cada método que faz alguma operação no banco, a hibernate session é aberta, utilizada e fechada em seguida, ou seja, a sessão a qual um objeto foi carregado estará sempre fechada. É claro que podemos mudar isso e deixar a sessão aberta por mais tempo, mediante alguma condição para fechá-la, mas isso acarretaria outros problemas que prefiro não comentar neste momento.
Não me agrada a idéia de inicializar o objeto lazy assim que entidade pai for carregada, pois eu teria que saber de ante-mão se aquele objeto lazy vai ser utilizado ou não e não sempre é possível saber, às vezes pode ser utilizado como às vezes não, vai depender muito do fluxo que o usuário percorrer, então às vezes estaria sendo feita uma carga de dados desnecessária.
Como o post já está grande, vou deixar outras coisas para outras dicussões, pois esta dúvida é a mais importante no momento.