Atenção: esse artigo tem um vídeo complementar. Clique e assista!
Boas práticas na hora de utilizar o Hibernate. Nesse artigo mostramos 12 dicas cujo uso é recomendado durante o desenvolvimento de aplicações que utilizam Hibernate.
Para que serve:
Mostrar como utilizar alguns recursos disponíveis no Hibernate com o objetivo de melhorar o desempenho da aplicação e a produtividade da equipe.
Em que situação o tema é útil:
As boas práticas devem ser usadas sempre que possível, uma vez que se trata de um melhor aproveitamento de recursos disponíveis, porém ociosos. Quando utilizadas, podem fazer a aplicação ter um melhor desempenho e uma manutenção facilitada.
Manual de Etiqueta do Hibernate:
O Hibernate é um dos frameworks de mapeamento objeto/relacional mais utilizados atualmente. Entretanto, muitos de seus recursos não são utilizados. Nesse artigo descrevemos 12 boas práticas para que você possa aproveitar melhor essa poderosa ferramenta. Algumas dicas servem para ajudar na manutenção da aplicação (colocar cada mapeamento de classe em seu próprio arquivo e deixar os mapeamentos e as classes mapeadas juntos). Outras dicas servem para melhorar o desempenho da aplicação (utilizar o flush() da maneira correta para minimizar acesso ao banco, usar consultas feitas à mão quando identificar algum gargalo, utilizar os caches da melhor maneira possível, dar preferência ao modo lazy na hora de recuperar os dados (lazy fetch) e dar preferência às associações bidirecionais). Há ainda aquelas que visam o aumento da segurança da aplicação (usar “?” ou named parameters nas consultas ao invés de valores mutáveis). Existem também as boas práticas que ajudam no funcionamento correto da aplicação (declarar identificadores nas classes que serão persistidas, utilizar algum pool de conexões confiável, anular as operações ao invés de tentar recuperá-las quando ocorrer uma exceção, utilizar o padrão Open Session in View para evitar problemas com objetos desassociados).
O Hibernate é hoje um dos frameworks de mapeamento objeto/relacional mais utilizados, concorrendo com grandes projetos como o TopLink, da Oracle, e o Cayenne, da Apache, ambos em Java. A estabilidade em que se encontra o projeto e as facilidades que ele oferece ao programador estão entre suas principais características. Tais facilidades ficam evidentes quando é necessário persistir informações no banco de dados ou recuperá-las dele. Na hora de realizar essas operações, o Hibernate cria as consultas para o desenvolvedor (apesar de permitir que elas sejam feitas manualmente) baseando-se em um mapeamento entre as classes Java e as tabelas do banco de dados.
Vários artigos na internet e na própria Java Magazine (Edições 28, 33, 73 e outras) mostram como é possível construir uma aplicação explorando os diversos recursos do Hibernate. Entretanto, nem sempre que criamos uma aplicação, conseguimos que ela tenha o desempenho desejado ou que a manutenção fique tão fácil quanto gostaríamos. Por isso, nesse artigo mostraremos 12 dicas sobre como é possível melhorar seu projeto através da utilização adequada de alguns recursos disponíveis no próprio Hibernate, mas que às vezes não são empregados da melhor maneira, como o suporte ao pool de conexões, ao cache de objetos e consultas, e várias outras funcionalidades que facilitam a persistência e recuperação dos dados.
Assumimos que você já esteja familiarizado com o Hibernate e seu funcionamento. Iremos nos concentrar nas boas práticas e não na construção de uma aplicação. Caso não saiba como iniciar uma aplicação, consulte os artigos citados ou a documentação do Hibernate. Há ainda vários tutoriais na internet, entre eles, no endereço www.vaannila.com/hibernate/hibernate-example/hibernate-tools-1.html e no site da Java Magazine.
As 12 boas práticas
Listamos aqui 12 boas práticas para o uso de algumas funcionalidades do Hibernate. Cada um dos tópicos é explicado a seguir permitindo que esta lista sirva de referência rápida para uma futura consulta. Os itens abordam assuntos comuns em aplicações que utilizam Hibernate como a distribuição dos arquivos dentro do projeto, técnicas de persistência e de consulta, entre outros. Vamos à lista:
1. Declare identificadores nas classes que serão persistidas;
2. Coloque cada mapeamento de classe em seu próprio arquivo;
3. Deixe os mapeamentos e as classes mapeadas juntos;
4. Use “?” ou named parameters nas consultas ao invés de valores mutáveis;
5. Utilize algum pool de conexões confiável;
6. Utilize o flush() da maneira correta para minimizar o acesso ao banco;
7. Use consultas feitas à mão quando identificar algum gargalo;
8. Quando ocorrer uma exceção, cancele as operações ao invés de tentar recuperá-las;
9. Dê preferência ao modo lazy quando for recuperar os dados (lazy fetch);
10. Dê preferência às associações bidirecionais;
11. Utilize o padrão Open Session in View para evitar problemas com objetos desassociados;
12. Utilize os caches da melhor maneira possível.
Declare identificadores nas classes que serão persistidas
Apesar de não ser obrigatório, é recomendável que as classes possuam um atributo de identificação. Ele serve para mapear a chave primária da tabela do banco de dados correspondente àquela classe. O Hibernate poderia ficar responsável pelo controle do objeto recuperado caso o atributo não fosse declarado. Entretanto, operações como Session.saveOrUpdate() e Session.merge() só podem ser feitas com a sua existência. No caso da operação Session.saveOrUpdate(), o Hibernate realiza uma checagem simples baseada no atributo de identificação para saber se o objeto deve ser salvo ou apenas atualizado. De uma maneira geral, se o objeto possuir um identificador nulo, ele deverá ser salvo. Caso contrário, basta atualizá-lo. Já no caso da operação Session.merge(), o objeto que estiver na sessão e que tiver o mesmo identificador do objeto passado será atualizado. Se não houver algum objeto na sessão com o mesmo identificador, então o Hibernate tentará recuperá-lo do banco de dados e irá atualizá-lo ou criará uma nova instância. Como podemos ver na Listagem 1, a inserção do atributo de identificação pode ser facilmente realizada.
...