Hibernate não serve para querys complexas?

41 respostas
jason_bourne

Pessoal,

Tava lendo sobre o hibernate e tive a impressão q ele não é indicado para se trabalhar com querys muito complexas que utilizam funções mt específicas de cada banco (ex: decode), pois requer um trabalho enorme para deixas compatíveis com o hibernate. Isso procede?

41 Respostas

T

procede, sem falar que você perde um pouco em performance também. Deve-se citar que qualquer função nativa do SGBD causa perda de portabilidade.

jason_bourne

Então eu só devo usar hibernate para querys simples? do tipo crud?

Aleksandro

Salve galera,

Estou começando a fuçar no struts 2 com a config acima e no site da apache há um exemplo , porém segui o exemplo certinho conforme esta no site e esta me dando a seguinte mensagem, já fiz uma série de testes e não consegui identificar apenas pelo log do erro, gostaria de saber se alguém pode me dar uma luz, valeu

SEVERE: Context initialization failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name personService: Injection of persistence methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name entityManagerFactory defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}

at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:314)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:986)

Aleks

L

O hibernate é um framework para ser utilizado em aplicações que contem um rico modelo oo
em que a logica da aplicação fica na propria aplicação java ,e nao no banco de dados que é caracterizado como um pobre modelo
mas para quem quer utilizar funções especificas do banco melhor utilizar jdbc.

Daniel_Quirino_Olive

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#connection()

Daí eu me pergunto: por que procede?

jason_bourne

lgweb:
O hibernate é um framework para ser utilizado em aplicações que contem um rico modelo oo
em que a logica da aplicação fica na propria aplicação java ,e nao no banco de dados que é caracterizado como um pobre modelo
mas para quem quer utilizar funções especificas do banco melhor utilizar jdbc.

Vlw pela explicação!

P

Eduardo!

Estou tentando desenvolver uma classe DAO Genérica, não se importando com a tabela e conexão usada, porém não tenhoa muita prática em JAVA, podemos então nos ajudar. Se for de sei interesse posso disponibilizar aqui no grupo minhas idéias já prontas.

Estou precisando muito de terminar essas classes.

Dê uma olhada em

http://www.guj.com.br/posts/list/72905.java

_fs

No caso específico do “decode” você pode usar o padrão SQL para a mesma funcionalidade: case … when … end. E HQL suporta esta expressão.

http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html#queryhql-expressions

jason_bourne

LIPE:
No caso específico do “decode” você pode usar o padrão SQL para a mesma funcionalidade: case … when … end. E HQL suporta esta expressão.

http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html#queryhql-expressions

Não achei decode la :frowning:

T

ué… acho que exagerei um pouco na portabilidade rs. Mas ja tivemos problemas com consultas bem complexas que retornam milhares de registros, e que o cliente pediu a alteração do sistema porque a performance do hibernate perto das queries nativas é absurdamente inferior…

_fs

http://www.remote-dba.net/pl_sql/t_decode_case_sql_oracle.htm
http://searchoracle.techtarget.com/ateQuestionNResponse/0,289625,sid41_cid545647_tax295980,00.html

Você pode usar CASE…WHEN…ELSE…END ao invés de decode().

jason_bourne

Absurdamente inferior? nossa…pq usam o hibernate então?

T

porque foi 1 caso em que realmente o banco era muito grande… Foi a excessão à regra…

T

há consultas que demoram tipo, 12 horas para serem realizadas com SPs. Detalhe… banco Oracle

ddduran

é por isso que quem entende de tecnologia somos nos e não os clientes, ne?

com base em que artigo vem essa informação do “cliente”?

alem do mais quando você faz uma query nativa no hibernate é o mesmo que executar num Statement

jason_bourne

Mas para pequenas consultas, o hibernate vai de boa?

_fs

Cara, a UNICA coisa que importa é o SQL gerado pelo Hibernate. A não ser que precise de funções aliens de seu banco de dados, basta usar HQL e pronto.

Caso precise das funções aliens, e realmente há casos para isso, basta fazer session.connection() e pirar a batatinha no jdbc.

ddduran

bom ai o amigo lgweb definiu bem por que isso acontece.

mais no hibernate ia demorar 12h + 5min :stuck_out_tongue:

ou seja insignificante

alem do mais o Hibernate funciona assim
existem coisas que o Hibernate ajuda para todas as outras coisas você pode passar por cima dele

ele não é tão extremista

ddduran

pras complexas tambem :slight_smile:

faelcavalcanti

não significa que por determinados casos específicos que seja a solução abstenir o uso do hibernate ou consequentemente do desenvolvimento ORM. casos específicos poderam ser tranquilarmente desenvolvidos em outros frameworks como JPA, iBATIS ou até mesmo JDBC.

agora acho estranho uma consulta ter que retornar milhares de registros em uma consulta. existem certos pontos a serem repensados. não vejo necessidade disto. hoje a internet está mais interativa e as requisições soam por demanda. o usuário ou product owner deve conhecer estes princípios.

pcalcado

Se isso for OLAP você nãod everia estar utilizando Hibernate de qualquer forma.

Se isso for OLTP você provavelmente tem um problema é no modelo de dados e não no ORM utilizado.

rodrigoallemand

Se isso for OLAP você nãod everia estar utilizando Hibernate de qualquer forma.

Se isso for OLTP você provavelmente tem um problema é no modelo de dados e não no ORM utilizado.

12hs pra rodar uma query no banco… ORACLE???
O problema é bem maior do que um erro na modelagem… Chame o Padre Quevedo pra te ajudar!!! “Isso é coisa do Psico! Isso ‘no ecxiste’!”

J2Alex

Olá Orlando,

problemas de performance com hibernate são comuns para a maioria dos usuários, mas eu posso afirmar que em quase a totalidade dos casos é devido à falta de conhecimento mais profundo do seu funcionamento. Trabalho diretamente com hibernate e posso te afirmar que ele é recomendável para 99,99 % dos casos. Existem necessidades muito específicas onde realmente ele não é aplicável, mas isso são exceções. Já consegui melhorar a performance de consultas em até 80%, fazendo otimizações nos mapeamentos. O hibernate é muito flexível, mas entre saber o trivial e ter um conhecimento mas apurado do seu funcionamento, há uma longa estrada a caminhar.

Agora, consultas que demoram 12 horas? Há algo de muito errado aí…

eduacsp, não… isso não procede…

jason_bourne

Olá Orlando,

problemas de performance com hibernate são comuns para a maioria dos usuários, mas eu posso afirmar que em quase a totalidade dos casos é devido à falta de conhecimento mais profundo do seu funcionamento. Trabalho diretamente com hibernate e posso te afirmar que ele é recomendável para 99,99 % dos casos. Existem necessidades muito específicas onde realmente ele não é aplicável, mas isso são exceções. Já consegui melhorar a performance de consultas em até 80%, fazendo otimizações nos mapeamentos. O hibernate é muito flexível, mas entre saber o trivial e ter um conhecimento mas apurado do seu funcionamento, há uma longa estrada a caminhar.

Agora, consultas que demoram 12 horas? Há algo de muito errado aí…

eduacsp, não… isso não procede…

Bota longa caminhada nisso…

T

Olá Orlando,

problemas de performance com hibernate são comuns para a maioria dos usuários, mas eu posso afirmar que em quase a totalidade dos casos é devido à falta de conhecimento mais profundo do seu funcionamento. Trabalho diretamente com hibernate e posso te afirmar que ele é recomendável para 99,99 % dos casos. Existem necessidades muito específicas onde realmente ele não é aplicável, mas isso são exceções. Já consegui melhorar a performance de consultas em até 80%, fazendo otimizações nos mapeamentos. O hibernate é muito flexível, mas entre saber o trivial e ter um conhecimento mas apurado do seu funcionamento, há uma longa estrada a caminhar.

Agora, consultas que demoram 12 horas? Há algo de muito errado aí…

eduacsp, não… isso não procede…

ops rs É meu, há casos e há casos… Houve um projeto por aqui por exemplo em que o cliente fez o favor de enviar os Pojos anotados em um jar, e não aceita alterações nele (Exemplo). Mas provavelmente falta conhecimento sim… Esse tipo de consulta é comum neste cliente específico. São normais consultas para emissão de relatórios que demorem horas, mas hoje são sempre feitas em PL/SQL (algumas mesmo assim demoram horas). Essa consulta ( não é bem somente uma consulta na verdade, é um conjunto delas. rs ) é excessão, mas acontece.

T

Olá Orlando,

problemas de performance com hibernate são comuns para a maioria dos usuários, mas eu posso afirmar que em quase a totalidade dos casos é devido à falta de conhecimento mais profundo do seu funcionamento. Trabalho diretamente com hibernate e posso te afirmar que ele é recomendável para 99,99 % dos casos. Existem necessidades muito específicas onde realmente ele não é aplicável, mas isso são exceções. Já consegui melhorar a performance de consultas em até 80%, fazendo otimizações nos mapeamentos. O hibernate é muito flexível, mas entre saber o trivial e ter um conhecimento mas apurado do seu funcionamento, há uma longa estrada a caminhar.

Agora, consultas que demoram 12 horas? Há algo de muito errado aí…

eduacsp, não… isso não procede…

ops rs É meu, há casos e há casos… Houve um projeto por aqui por exemplo em que o cliente fez o favor de enviar os Pojos anotados em um jar, e não aceita alterações nele (Exemplo). Mas provavelmente falta conhecimento sim… Esse tipo de consulta é comum neste cliente específico. São normais consultas para emissão de relatórios que demorem horas, mas hoje são sempre feitas em PL/SQL (algumas mesmo assim demoram horas). Essa consulta ( não é bem somente uma consulta na verdade, é um conjunto delas. rs ) é excessão, mas acontece.

OPS esqueci!!! Parabéns Alexandre!!! hehehe

jason_bourne

Olá Orlando,

problemas de performance com hibernate são comuns para a maioria dos usuários, mas eu posso afirmar que em quase a totalidade dos casos é devido à falta de conhecimento mais profundo do seu funcionamento. Trabalho diretamente com hibernate e posso te afirmar que ele é recomendável para 99,99 % dos casos. Existem necessidades muito específicas onde realmente ele não é aplicável, mas isso são exceções. Já consegui melhorar a performance de consultas em até 80%, fazendo otimizações nos mapeamentos. O hibernate é muito flexível, mas entre saber o trivial e ter um conhecimento mas apurado do seu funcionamento, há uma longa estrada a caminhar.

Agora, consultas que demoram 12 horas? Há algo de muito errado aí…

eduacsp, não… isso não procede…

ops rs É meu, há casos e há casos… Houve um projeto por aqui por exemplo em que o cliente fez o favor de enviar os Pojos anotados em um jar, e não aceita alterações nele (Exemplo). Mas provavelmente falta conhecimento sim… Esse tipo de consulta é comum neste cliente específico. São normais consultas para emissão de relatórios que demorem horas, mas hoje são sempre feitas em PL/SQL (algumas mesmo assim demoram horas). Essa consulta ( não é bem somente uma consulta na verdade, é um conjunto delas. rs ) é excessão, mas acontece.

Eu justamente estou tendo que converter um pl/sql de 1300 linhas pra java. Pensei em usar hibernate, mas como não manjo levaria mt tempo para aprende-lo e depois conseguir algum resultado. Tive que criar quase 50 beans de entidade e dezenas de DAOs…na verdade ainda estou criando.

L

sera que vc não esta utilizando "from clientes " em uma tabela com 2000000.000 registros ?
rsrsrsrsrsrsrsr

T

então, esse é um “caso de insucesso” rs que me contaram algum tempo atrás. Não sei exatamente como as coisas estavam feitas. Só sei esses dados absurdos e das consultas que o pessoal que fica alocado nesse cliente de vez em quando comenta… Mas são bem mais dados que 200.000 registros…

J2Alex

Valeu pelos parabens… :lol:

marciosantri

Como por aqui utilizamos muitos recursos do banco (Oracle, no caso) e pelo menos por enquanto não temos a intenção de fazer um software que funcione em diversos bancos, preferimos desenvolver uma biblioteca de acesso utilizando o JDBC só que facilitando (e muito) as consultas e a criação de objetos. Agilidade na criação de classes e na busca ao mesmo tempo.

julynhaprado

Bom dia pessoal,

Tenho uma aplicação que usa Hibernate, Spring Security e PrimeFaces, porém algumas páginas com demoram renderizar porque a consulta demora muito para retornar a lista.

Sei pouco sobre Hibernate, e gostaria de saber uma forma de otimizar algumas consultas no BD (postgresql).
Li a respeito dos mapeamentos porém não consegui implementá-los de uma forma correta para que se torne mais rápidas as buscas.
Vocês indicam alguma coisa? Algum material?

Ahhh, também li a documentação porém como já disse não consegui implementar.
O pool de conexões está configurado, e achei muitas formas de fazer isso… Sabe aquela sensação de “será que estou fazendo certo?” “é assim mesmo?”
:roll:

ErickRAR

Pagination pode te ajudar.

julynhaprado

Já tentei, mas quando tem paginação eu clico na página 2 e demora também.

ErickRAR

E com o cache do hibernate? Nunca utilizei, mas também é uma solução.

julynhaprado

Tentei usar, ainda não obtive sucesso.
Vou continuar tentando, já que você disse que é uma solução.
:wink:

Mais alguma sugestão?

fantomas

julynhaprado, performance envolve muitos detalhes:

  1. Já verificou se as tabelas envolvidas possuem índices que satisfazem a query?
  2. Já comparou a execução da query fora e dentro do hibernate?
  3. Já verificou se é possível otimizar a query ainda mais?
  4. Você tem algum DBA para verificar estas execuções?
  5. Sempre foi lento ou ficou lento recentemente?

flws

julynhaprado

fantomas:
julynhaprado, performance envolve muitos detalhes:

  1. Já verificou se as tabelas envolvidas possuem índices que satisfazem a query?
  2. Já comparou a execução da query fora e dentro do hibernate?
  3. Já verificou se é possível otimizar a query ainda mais?
  4. Você tem algum DBA para verificar estas execuções?
  5. Sempre foi lento ou ficou lento recentemente?

flws

  1. Sim, as tabelas possuem índices que satisfazem a query.
  2. Eis a questão, acredito que está aí o problema. O hibernate busca objetos desnecessários, e isso executado sem o hibernate é rápido. Por isso acredito que seja o mapeamento.
  3. Cogitei essa possibilidade, porém acho que já estão otimizadas. Acredito que a causa seja o hibernate buscar objetos desnecessários.
  4. Aqui não temos DBA.
  5. Como o número de cadastros aumentou, isso aconteceu recentemente. Os dados aumentaram nas tabelas.

Isso acontece na execução do sistema todo onde possuo um grande número de registros nas tabelas no banco de dados.

ErickRAR

Também pode ser o Lazy de seus relacionamentos, dê uma pesquisada nisso.

ManoJava

Bom dia!!

Utilize o SqlDeveloper para rodar suas queryes e veja o plano de execução e explicação, e veja se também vc nao esta fazendo nenhum cross join.

Att.

fantomas

Então july, concordo com o ErickRAR, verifique as estratégias para utilizar LAZY.

Se ao tentar aplicar o LAZY vc achar que é um “puta pé no s@C#”, que é chato ou até difícil e confuso saiba que é normal.

Detalhe: Se o LAZY for a solução provavelmente o sistema inteiro (o modelo) deve estar afetado, portanto selecione um único módulo para ajustar; se tudo der certo propague a solução, caso seja necessário, para as outras áreas.

flws

Criado 29 de outubro de 2007
Ultima resposta 2 de out. de 2012
Respostas 41
Participantes 17