Hibernate Lazy Loading + Jersey Rest = Carregamento ansioso?
Pergunta
Estou desenvolvendo uma aplicação cliente-servidor com o Hibernate como camada de persistência e Jersey Rest for Network Communication.
Dado um usuário com funções:
- Quando quero exibir todos os usuários do cliente, não quero que os papéis sejam carregados por Hibernate e não quero que eles sejam enviados pela rede
- Quando quero modificar as funções do usuário, quero que eles sejam carregados e sejam transferidos
Estou usando um padrão de pré -carregamento (http://bwinterberg.blogspot.com/2009/09/hibernate-preload-pattern.html), para determinar quais propriedades devem ser carregadas por hibernação. Isso funciona bem.
No caso 1, nenhum papel é carregado pelo hibernado, assim como o pretendido. Mas assim que Jersey cria o XML a ser enviado ao cliente, ele lê as funções do usuário, o que, por sua vez, permite hibernar carregar as funções (e todas as outras propriedades). No final, o Hibernate sempre carrega a árvore completa dos conjuntos de dados pertencentes a um usuário.
Pensei em separar o usuário fechando a sessão antes de passar o usuário para Jersey, para que o Hibernate não possa carregar as funções, mas isso não parece ter nenhum efeito.
Alguma ideia?
Solução
Faça um clone raso da sua entidade e defina uma coleção vazia, antes de dar -a para serializar
Faça um proxy personalizado da coleção proxiada e delegue o carregamento apenas em algumas circunstâncias (a primeira USECASE) e retorne uma coleção vazia em outros