Carregamento lento com Spring HibernateDaoSupport?
-
23-09-2019 - |
Pergunta
Saudações, estou desenvolvendo uma aplicação não web usando Spring+Hibernate.Minha dúvida é como o HibernateDaoSupport lida com o lazy-loading, pois após uma chamada do DAO, a Session é fechada.
Dê uma olhada no seguinte psuedo-código:
DAO é como:
CommonDao extends HibernateDaoSupport{
Family getFamilyById(String id);
SubFamily getSubFamily(String familyid,String subfamilyid);
}
O modelo de domínio é como:
Family{
private List<SubFamily> subfamiles;
public List<SubFamily> getSubFamiles();
}
SubFamily{
private Family family;
public Family getFamily();
}
No aplicativo, obtenho DAO do contexto do aplicativo e desejo seguir as operações. Isso é possível com carregamento lento porque AFAIK após cada método (getFamilyById() , getSubFamily() ) a sessão é fechada.
CommonDAO dao=//get bean from application context;
Family famA=dao.getFamilyById(familyid);
//
//Do some stuff
List<SubFamily> childrenA=fam.getSubFamiles();
SubFamily asubfamily=dao.getSubFamily(id,subfamilyid);
//
//Do some other stuff
Family famB=asubfamily.getFamily();
Solução
Minha dúvida é como o HibernateDaoSupport lida com o carregamento lento, pois após uma chamada ao DAO, a Sessão é fechada.
Os DAOs não criam/fecham uma Sessão para cada chamada, eles não são responsáveis por isso e isso geralmente é feito usando o "Abrir sessão na visualização"padrão (o Spring fornece um filtro ou interceptador para isso).Mas isso é para aplicativos da web.
Em um aplicativo swing, uma solução é usar sessão longa.Você terá que decidir pontos bem definidos para fechar a sessão para liberar memória.Para aplicações pequenas, isso geralmente é simples e funcionará.Para maiores (ou seja,aplicativos da vida real), a solução certa é usar uma sessão por quadro/quadro interno/caixa de diálogo.É mais difícil de gerenciar, mas será escalonado.
Alguns tópicos que você pode querer ler:
- hibernar LazyInitializationException no aplicativo rich client
- Suporte para sessões longas do Spring/Hibernate ou práticas recomendadas?
- Manter a sessão de hibernação aberta no cliente swing? (este é IMHO o mais interessante, especialmente o nº 9)
- E a Aplicativo de demonstração Hibernate e Swing
Outras dicas
Em muito mais tempo e investigação, parece que este é um comportamento "normal".O erro não importa realmente e é jogado fora do melhor que posso dizer;Pode nem ser um erro real em vida real.Parece que os clientes do escritório fazem algumas coisas hackes para fazer o que fazem.