Este é um post disponível para assinantes MVPArtigo Java Magazine 33 - Hibernate na Web
Artigo Publicado pela Java Magazine 33.

Hibernate na Web
Avaliando Arquiteturas e Criando uma Aplicação Completa
Conheça melhores práticas para usar o Hibernate em aplicações web e a lidar com locks otimistas, aplicando os conceitos em um exemplo prático
Fernando Lozano
Neste são apresentadas melhores práticas para uso do framework Hibernate dentro de aplicações web, e para lidar com transações da aplicação utilizando técnicas de “lock otimista”. As práticas são ilustradas com um exemplo completo, útil em várias empresas: uma aplicação de reserva de salas de reuniões. (Com poucas modificações, principalmente na entrada de dados, a mesma aplicação poderia lidar com reservas de assentos em teatros, lugares em vôos, quartos de hotéis e outros cenários similares.)
A aplicação será desenvolvida respeitando boas práticas do desenvolvimento JEE, em especial a separação em camadas de apresentação, negócio e persistência, e a arquitetura MVC. O quadro “Camadas em uma aplicação web” relembra e relaciona esses conceitos. Não será utilizado outro framework além do Hibernate, embora as técnicas apresentadas aqui sejam aplicáveis a aplicações baseadas no Struts, JSF, Spring, WebWork e outras tecnologias. E apesar do foco em aplicações web, as práticas e o código referente ao Hibernate (para a camada de persistência) poderiam ser utilizados sem modificações em aplicações não-web.
Vamos utilizar o Tomcat 5.5, e o JSTL 1.1 (através da implementação Jakarta Taglibs Standard; veja as referências ao final do artigo). Para o leitor que não acompanhou o artigo sobre o Hibernate na Edição 28, o quadro “Conceitos essenciais do Hibernate” fornece um resumo das principais classes e arquivos de configuração do framework.
Sessions do Hibernate x containers web
Antes de apresentar detalhes do exemplo, precisamos discutir alguns conceitos importantes para o entendimento da nossa aplicação.
A adequação do Hibernate a uma aplicação web envolve quatro atividades fundamentais:
1. Criação de um SessionFactory.
2. Obtenção e liberação de conexões ao banco de dados.
3. Criação e fechamento de um Session[1].
4. Demarcação de início e fim de um Transaction no banco de dados.
A criação de um SessionFactory é um processo caro, assim o ideal é realizá-lo uma única vez para toda a aplicação. O mesmo SessionFactory pode ser compartilhado por múltiplos threads: só necessitamos de um local onde colocar este objeto, que seja visível aos demais objetos dentro da aplicação.
Então basta identificar um local (e um momento) apropriado para criar o SessionFactory dentro da aplicação web, e estabelecer uma forma de compartilhar esta única instância entre todas as classes de persistência da aplicação. O SessionFactory também é o responsável por gerenciar conexões ao banco de dados feitas pelo Hibernate, assim a definição de como realizar a primeira atividade implica em definir também a segunda.
O Session e o Transaction geralmente andam juntos, pois uma transação deve ser iniciada e completada com uma mesma sessão aberta. Uma única sessão pode ser utilizada para várias transações, mas isto traz o risco de que a aplicação utilize versões obsoletas dos objetos persistentes que são gerenciados pela sessão. Além disso, uma sessão pode conter uma grande quantidade de objetos e mantê-los abertos e vinculados à sessão HTTP, para atender a várias requisições de um mesmo usuário. Isso pode prejudicar seriamente performance da aplicação em ambientes de cluster. Existem cenários válidos para o que a documentação do Hibernate chama de “sessões longas” (long sessions), onde uma única sessão engloba várias transações, mas o autor (e os criadores do Hibernate) prefere não usar esta prática.
Dessa forma, iremos impor que todas as sessões sejam criadas e fechadas dentro da mesma requisição HTTP, e a definição das atividades (3) e (4) se resume também em identificar o local e o momento apropriado para iniciar e fechar simultaneamente um Session e um "
ATENÇÃO! A exibição deste artigo foi interrompida.
Este é um post disponível para assinantes MVP
Space do autor


0
0
