Quando você pode/deve ir até o fim com a abordagem ORM?
-
09-06-2019 - |
Pergunta
Parece-me que a introdução de uma ferramenta ORM deve tornar sua arquitetura mais limpa, mas para maior eficiência, acabei ignorando-a e iterando um conjunto de resultados JDBC ocasionalmente.Isso leva a um emaranhado descoordenado de artefatos em vez de uma arquitetura mais limpa.
É porque estou aplicando a ferramenta em um contexto inválido ou é mais profundo do que isso?
Quando você pode/deve ir até o fim com a abordagem ORM?
Qualquer visão seria muito apreciada.
Um pouco de contexto:
No meu ambiente, tenho cerca de 50 computadores clientes e 1 SQL Server razoavelmente poderoso.
Eu tenho um aplicativo de desktop no qual todos os 50 clientes acessam os dados o tempo todo.
O Modelo de Dados do projeto passou por uma série de reorganizações por vários motivos, incluindo clareza, eficiência, etc.
História do meu modelo de dados
- Chamadas JDBC diretamente
- DAO + POJO sem relações entre Pojos (basicamente envolvendo o JDBC).
- Adicionadas relações entre POJOs implementando Lazy Load, mas apenas ocultando as chamadas inter-DAO
- Entrei no movimento do Hibernate depois de ver como ele tornava o acesso aos dados "simples" (tornava triviais as relações entre POJO) e porque poderia diminuir o número de viagens de ida e volta ao banco de dados ao trabalhar com muitas entidades relacionadas.
- Como era um aplicativo de desktop, manter as sessões abertas por um longo prazo era um pesadelo, então acabou causando muitos problemas
- Voltei para uma abordagem DAO/Hibernate parcial que me permite fazer chamadas JDBC diretas atrás da cortina DAO e ao mesmo tempo usar o Hibernate.
Solução
Hibernate faz mais sentido quando seu aplicativo funciona gráficos de objetos, que são persistidos no RDBMS.Em vez disso, se a lógica do seu aplicativo funcionar em uma matriz de dados 2D, buscá-los via JDBC direto funcionará melhor.Embora o Hibernate seja escrito sobre JDBC, ele possui recursos que podem não ser triviais de implementar em JDBC.Por exemplo:
- Digamos que o usuário visualize uma linha na IU e altere alguns dos valores e você queira disparar uma consulta de atualização apenas para as colunas que realmente foram alteradas.
- Para evitar impasses, você precisa manter uma ordem global para SQLs em uma transação.Fazer isso direito, JDBC pode não ser fácil
- Configurando facilmente o bloqueio otimista.Ao usar JDBC, você precisa se lembrar de ter isso em todas as consultas de atualização.
- Atualizações em lote, materialização preguiçosa de coleções, etc. também podem não ser triviais de implementar em JDBC.
(Eu digo "poder não seja trivial", porque é claro que isso pode ser feito - e você pode ser um super hacker :)
O Hibernate também permite que você dispare suas próprias consultas SQL, caso seja necessário.
Espero que isso ajude você a decidir.
PS:Manter a sessão aberta em um cliente de desktop remoto e ter problemas não é problema do Hibernate - você enfrentaria o mesmo problema se mantivesse a conexão com o banco de dados aberta por muito tempo.