Hibernate - Dúvida sobre coleções

Boa tarde!

Temos uma aplicação JSF que utiliza Hibernate, da qual vamos refatorar alguns pontos para melhora de performance.

Minha dúvida é sobre o uso de coleções, na qual uma entidade Pai pode ter várias coleções de entidades filhos (utilizando Set<>). Utilizando o mapeamento dessas coleções o desenvolvimento é bastante facilitado, dado que manipulamos as coleções na entidade pai e persistimos, e o hibernate já lida com as alterações, inserindo registros, alterando e excluindo os objetos filhos conforme necessário.

Porém, mesmo utilizando fetch LAZY, o sistema ficou relativamente grande e lento quando precisamos fazer consultas que tragam muitos objetos com suas coleções (carregadas explicitamente nas criterias).

Como iremos refatorar, gostaria de saber se existe alguma outra abordagem este tipo de situação, bem como de que forma os dev’s mais experientes lidam com esse tipo de questão na prática.

Supondo que temos uma tela de vendas, com a entidade venda e a entidade vendaproduto… qual a melhor forma de construir este lançamento?

Hoje instanciamos venda = new Venda() e no front-end vamos adicionando objetos vendaproduto na coleção de venda, e persistimos venda, Ao carregar uma venda, explicitamos a leitura da coleção (para não cairmos em um select N+1 das entidades filho)

É isso mesmo ou existe outra abordagem?

Obrigado desde já

1 curtida

Voce pode deixar tudo como lazy e usar HQL/JPQL pra cada consulta específica, aplicando fetch join somente nos relacionamentos necessários para o resultado.

Eu prefiro fazer diretamente o SQL sob meu controle e jogar o resultado em um DTO via JDBC Template, sem esses overheads e mistérios do hibernate.

Gosto da idéia de deixar de usar o Hibernate, ainda que signifique um tanto a mais de trabalho. O uso do JDBC Template não tem segredo, mas eu gostaria de umas sugestões sobre umas dúvidas. Qual a possibilidade de uma consultoria paga de uma ou duas horas?

rmarcelodeoliveira@gmail.com

Nao tenho disponibilidade. Mas quanto a se manter com hibernate e esse modelo OO, basta seguir a dica que passei no primeiro parágrafo, usar HQL/JPQL aplicando fetch nos relacionamentos necessários para cada consulta. Dessa forma o hibernate vai gerar um único SQL, nao caindo no problema de n + 1. No geral pesquise sobre HQL e join fetch. Exemplo: https://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

Tinha lido errado. Se também prefere o JDBC Template, segue alguns exemplos:

E não acho mais trabalhoso, o tempo que se perde com a engenhosidade do hibernate, com JdbcTemplate ganha-se em tranquilidade e controle pra um melhor resultado sem obscuridades.

Desde a sua sugestão estou estudando melhor o JDBC Template e tudo ok. Mas ainda não encontrei uma forma de controlar transações (commit e rollback) para o meu cenário.

A aplicação é JSF e utiliza OpenSessionInViewFilter (abertura de sessão no começo do ciclo e commit na última).

As estratégias que encontrei sobre Jdbc Template eram para aplicações springboot. Tem alguma sugestão sobre isso?

Usa a anotação @Transactional em cima do método que vai fazer a transação. Acho que JdbcTemplate não é só pra aplicações spring boot.

O tópico é perfeito para meu problema.
Tenho uma solução com problema de performance, usando Hibernate. E, após 10 anos de uso de sistema com uma base considerável, o sistema congela!
Pesquisei mto sobre, e refatorar meu código sem o uso do Hibernate está sendo a medida mais plausível.

Gostaria de um help com material para eu estudar e me basear nessa mudança.

Grata.

Tati, optei pelo uso de Jdbc template (spring) e toh gostando muito