Pergunta

Eu sei que isto é uma questão subjetiva, mas por que Hibernate parecem ser projetado para sessões vida curta? Geralmente em meus aplicativos posso criar DAOs para abstrair a minha camada de dados, mas já que não posso prever como os objetos de entidade estão indo para ser usado algumas de suas coleções são preguiçosos carregado, ou devo dizer deixar de carga uma vez que a sessão é fechada.

Por que eles não projetá-lo para que ele iria automaticamente re-abrir a sessão, ou ter sessões sempre ficar aberto?

Foi útil?

Solução

Becuase uma vez que você sair de sua transação limite que você não pode bater o banco de dados novamente sem iniciar uma nova transação. Tendo transações de execução longa 'just in case' é uma coisa ruim (tm).

Eu acho que você quer objeto carga lenta do seu ponto de vista - uma olhada aqui para algumas opções. Eu prefiro definir exatamente o quanto do mapa de objeto vai ser devolvido pela minha sessão de métodos de fachada. Acho que isso torna mais fácil para teste de unidade e teste de desempenho a minha camada de negócios.

Outras dicas

Eu trabalhei em um aplicativo de desktop que usou EJB e Hibernate. Tivemos de conjunto lazy=false em todos os lugares, porque quando os objetos são serializados, eles perdem a sua capacidade de ser buscada a partir do backend. Isso é apenas como vai ser, infelizmente.

Se você está preocupado com o desempenho, você pode usar o cache no backend para que suas buscas não-preguiçosos não são tão doloroso.

Você está procurando o padrão OpenSessionInView, que é essencialmente um filtro conceitual (e às vezes implementado como um filtro de servlet) que detecta quando uma sessão precisa ser transparente reaberto. Vários quadros de implementar isso para que ele manipula-lo automagicamente.

Eu estou escrevendo um aplicativo de área de trabalho para usar um filtro não é aplicável.

As conexões são um recurso escasso que precisam ser reciclados, logo que tiver terminado de usá-los. Se você também estiver usando o pool de conexão, recebendo outro quando você precisar dele deve ser rápido. Esta é a arquitetura que você tem que usar para fazer escala sites -. Mesmo que você é um aplicativo de desktop, seus casos de uso provavelmente se concentrar em sites escaláveis ??

Se você olhar para MS ADO.NET, você verá um foco semelhante em manter conexões abertas para um curto período de tempo -. Eles têm todo um modelo off-line para atualização de dados desconectados e, em seguida, aplicar a um banco de dados quando estiver pronto

O Hibernate é concebido como uma forma de mapear objetos para tabelas de banco de dados relacional. Ele realiza esse trabalho muito bem. Mas, não pode agradar a todos o tempo todo. Acho que há alguma complexidade em aprender como inicialização obras, mas quando você pegar o jeito da coisa que faz sentido. Eu não sei se ele foi necessariamente "projetado" para especificamente para a raiva de você, é apenas a maneira que aconteceu.

Se ele estava indo para reabrir magicamente sessões não-webapps Eu acho que a complexidade da aprendizagem do quadro iria longe sobrelevar os benefícios.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top