Você não gosta do Hibernate? Eu tb não! Leia para entender o porquê

Não precisa fazer absolutamente nada. Basta adicionar o campo no seu mapeamento. Acho que isso tanto o iBatis, Hiberante e MentaBean são iguais.

Eu vejo o Hibernate como o Maven. Para o corriqueiro ele vai resolver muito bem, mas para qualquer outra coisa mais complexa você vai ficar na mão a não ser que vc conheca o Hibernate tanto quanto o Gavin King.

Não tenho obrigacão de saber escrever um left outer join agrupado com somatório, ordenado, limitado, paginado e otimizado pelos indices certos usando HQL/Criteria junto com aquelas configuracões de relacionamento malucas. Agora em SQL eu não tenho desculpa. Para coisas complexas o melhor é vc assumir o controle ao invés de torcer para que a mágica funcione, e PL/SQL é a maneira mais natural para isso.

[quote=saoj][quote]
O problema da utilização do JDBC do modo tradicional é a replicação de código entre diversas classes. A adição de um campo novo no banco cria um problema, pois diversas consultas devem ser alteradas, e como saber onde tudo deve ser alterado?
[/quote]

Não precisa fazer absolutamente nada. Basta adicionar o campo no seu mapeamento. Acho que isso tanto o iBatis, Hiberante e MentaBean são iguais.
[/quote]
Estou falando de usar consultas direto no código. Sem a utilização de um framework, ou aonde a utilização de frameworks mais simples não atendem.

[quote=saoj][quote]

Eu vejo o Hibernate como o Maven. Para o corriqueiro ele vai resolver muito bem, mas para qualquer outra coisa mais complexa você vai ficar na mão a não ser que vc conheca o Hibernate tanto quanto o Gavin King.

Não tenho obrigacão de saber escrever um left outer join agrupado com somatório, ordenado, limitado, paginado e otimizado pelos indices certos usando HQL ou Criteria. Agora em SQL eu não tenho desculpa. Para coisas complexas o melhor é vc assumir o controle ao invés de torcer para que a mágica funcione, e PL/SQL é a maneira mais natural para isso.
[/quote][/quote]
Discordo de você. O hibernate atende bem a 95% das necessidades, ao contrário do MentaBeans. E nos 5% restantes ai sim você não só pode como deve usar SQL.

Agora o mais importante no seu argumento:
[quote=saoj]Não tenho obrigacão de saber escrever um left outer join agrupado com somatório, ordenado, limitado, paginado e otimizado pelos indices certos usando HQL ou Criteria.Agora em SQL eu não tenho desculpa[/quote]

Isso é o maior problema que encontro no desenvolvimento de software. As pessoas não querem apreender algo novo, que fuja a aquilo que com tanto sacrificio apreenderam. Elas não querem mudanças. Elas criam uma zona de conforto e lutam contra tudo e todos que tentam mudar isso!

Em uma área em que a mudança é a única certeza isso é um grave problema. Vejo isso na mudança de paradigmas de programação, na adoção de testes, na adoção de práticas ágeis. As pessoas não querem mudar. Elas não querem apreender algo novo. Então se protegem criando falácias para a maioria das novas ideias e ferramentas apresentadas.

acho que a grande maioria aqui que esta defendendo o Hibernate se deve ao seguinte fato:

Maioria não sabe fazer com JDBC o que se faz com hibernate. o hibernate ele facilita a maioria das coisas, principalmente tempo, trabalho e etc

então o pessoal esta se justificando o por que não utiliza o hibernate mesmo que isto custe o desempenho final da aplicação.

Discordo.

Eu gostaria muito de estudar e aprender: Click, Cocoon, Struts, Tapestry, Wicket, AppFuse, Aranea, Context Framework, Eclipse RAP, FormEngine, Google Web Toolkit, Hamlets, IceFaces, ItsNat, JavaServer Faces, JBoss Seam, Jspx-bay, JVx WebUI, ManyDesigns Portofino, OpenLaszlo, OpenXava, Oracle ADF, Play!, RIFE, Shale, Sling, SmartClient, Spring, Stripes, ThinWire, Vaadin, Wavemaker, WebObjects, ZK, ztemplates.

Mas não tenho tempo nem neurônio para isso. Não sou um savant.

Então nesse mundo onde você tem um milhão de maneiras de fazer a mesma coisa, você estará perdido se não tiver uma bússola. Conhece aquele ditado: “Para quem não sabe onde quer ir qualquer caminho serve!” ou “Não importa a velocidade que você sobe a escada quando ela está encostada na parede errada!” ?

Minha bússula, que não necessariamente tem que ser usada por outros, me diz que COMPLEXIDADE é EVIL. Qualquer pessoa mediana pode fazer qualquer coisa funcionar bem em programacão. A diferenca é como se faz. Se um cara pega o meu sistema e não entende, ou ele é muito fraco ou eu é que sou. E na grande maioria das vezes será a última opcão. O que mais tem por aí são sistemas que só o autor entende, que poderia ter 5 objetos mas tem 50, que poderia ter usado 3 frameworks mas utilizou 30. Menos é mais! Foi o que o cara do pequeno principe falou. (“Em tudo na vida a perfeição é finalmente atingida, não quando nada mais existe para acrescentar, mas quando não há mais nada para retirar.”)

Então deixando de lado a enrolacão e indo direto ao ponto da minha discordância:

Eu só dou um passo para aprender uma coisa nova em tecnologia se eu vejo que o passo é na direcão da SIMPLICIDADE, do low-level para o high-level. do KISS principle, da complexidade maior para a complexidade menor, do aumento de produtividade. Por isso que eu não tento aprender o Hibernate, pois a minha bússula não aponta para ele. Aponta para coisas lightweights e flexíveis, sem configuracões bizarras onde eu posso entender o grande e o pequeno e que eu tenha certeza que o cara que olhar vai entender.

O Hibernate de simples não tem nada. Digite no google ‘site:www.guj.com.br problemas hibernate’ e veja quantos problemas ele te retorna. Então o meu ponto inicial continua sendo. Se você já sabe SQL e JDBC, duas coisas bem simples, não há porque abracar a complexidade extra do Hibernate, a não ser que vc queira por um daqueles motivos que citei acima. Use iBatis ou MentaBean que são bem mais simples, intuitivos, flexíveis e não-intrusivos.

Ai você colocou uma questão interessante, é a sua bussola, o seu ponto de vista! Do seu ponto de vista não vale a pena entender. Mas é o seu ponto de vista.

Ai você está afirmando que é algo bizarro, mas como afirmar que algo é bizzaro quando não se conhece aquilo da afirmação. Você até pode dizer que “acha” que aquilo é bizarro, pois não entende como funciona, mas você está afirmando. Como você pode afirmar que algo é bizarro se não conhece a fundo? Eu não posso afirmar que algo que eu não entenda, ou não queira entender, seja bizarro, mas você afirma que o Hibernate faz “mágica”, que tira o controle das suas mãos. Como você pode afirmar isso se não entende o hibernate?

Você está atacando uma tecnologia que ampramente utilizada, por que sua bússola não aponta para ela, por você “acha” que não deve apreende-la, por que “acha” que exista um forma mais simples. Mas é o que você “acha”!
Minha bússola já aponta para outros caminhos. Ao contrário da sua que é guiada pela simplicidade a minha é guiada pela experiência. E a minha bússola indica que nem sempre o caminho mais fácil ou simples é o melhor. A adição de complexidade é inerente ao desenvolvimento de sistemas. Um sistema sempre começa de maneira simples como um “sisteminha”, mas com o tempo a complexidade vai aumentando. O sistema perde sua simplicidade e já não posso mais usar as mesmas ferramentas de antes. O “sisteminha” está virando um “sistemão” e a complexidade deste requer que você use as ferramentas apropriadas.

O problema é que você coloca o uso desses frameworks mais simples como a bolachinha mais recheada do pacote e isso não é verdade. Eles podem ser melhor para determinados casos, para CRUDs repetitivos. Mas quando o caldo entorna eles perdem seu valor. Quando a simplicidade do sistema morre não da para insitir no uso dessas ferramentas.

Verdade, não posso afirmar que o Hibernate é bizarro, até porque ele não é. O que eu disse que é bizarro são as configuracões:

Então re-afirmando: O que é bizarro, na minha opinião pessoal, é tentar resolver complexidade com configuracão. Por exemplo, relacionamentos entre objetos é algo complexo e inerente de qualquer sistema. Se vc tentar abstrair isso usando configuracão, vc apenas transfere complexidade do código para configuracão. Por que eu gosto de configuracao programática? Por que não deixa de ser código, não deixa de ser OO e sendo assim vc pode abstrair e simplificar as coisas ali. Mas como vc simplifica/abstrai/encapsula um XML? Como faz isso com annotations? O que é bizarro pra mim é o conceito de complexidade na configuracão. Lugar de complexidade é em código onde ela pode ser abstraída/refatorada/minimizada. Muito da mágica do Hibernate acontece via configuracão. Isso na minha opinião pessoal é um passo na direcão errada.

Entendo a sua argumentacão. Um sisteminha vira um sistemão, mas o que garante que ele vai ficar sob controle do ponto de vista da complexidade não é o Hibernate e suas 1001 maravilhas, mas sim uma FUNDACAO lightweight e simples. Se comeca pesado e complexo, não tem como simplificar depois. Roda um projeto no stack Java tradicional Hibernate + Spring e veja o bolo que ele levanta, veja o peso e a quantidade de log que ele gera, veja aquelas exceptions que pulam do meio do nada, fazendo coisas que vc nunca pediu para serem feitas, mas que agora vc vai ter que que se virar porque pelo menos vc está usando o PADRÃO do mercado.

Sempre que eu escuto a palavra PADRÃO e ESPECIFICACÃO fico preocupado. Me lembro de EJB, de JSF, etc. Padrão e Especificacão não são necessariamente bons, e quase nunca o são.

Se o banco possui toneladas de campos com nomes que precisam corresponder a algo mais legível no modelo, se o modelo tem muitas propriedades transient ou se os joins causam problemas, o hibernate apenas trouxe a tona essa complexidade através das anotações. não tem milagre. o hibernate apenas joga na cara dos programadores complexidade que ele está mapeando.

Mas as anotações e o mapeamento via xml (que pessoalmente eu não gosto, pois torna o mapeamento complexo) não tem nada haver com configuração!"

As anotações não são configurações! De modo algum! Basicamente a anotação representa uma tarefa que deve ser feita pelo compilador. Essa tarefa é programada!
Ao invés de eu fazer o mapeamento programaticamente, que é uma tarefa monótona e repetitiva eu programo isso e crio uma anotação. Ao ver essa anotação o compilador irá “substituir” o código pelo o que eu programei anteriormente. Isso vale também para o mapeamento via XML.
A meu ver isso é mais simples do que fazer na mão. Se a busca é pela simplicidade essa é a melhor opção

Discordo. Anotação é configuração, um pouco melhor que XML, mas continua sendo markup e metadata. De código de programação não tem nada. Você consegue fazer um IF ou um LOOP com uma anotação?

Seguindo essa lógica eu poderia dizer que Java é código Assembly. Só porque uma coisa mais tarde vira outra, não significa que ela seja essa outra coisa. Annotation não é código, pelo menos para quem usa. Se o compilador faz ela virar código depois, isso não tem nada haver com quem está usando as anotações. Vc vai continuar tendo que entender e configurar as anotações bem certinho se não um abraço!

O Hibernate te entrega ANNOTATIONS ou XML para configurar. Ele NÃO te entrega uma API/DSL para vc configurar. Se vc quiser fazer sua própria annotation para configurar qualquer coisa no Hibernate, vc vai ter que olhar o código fonte do framework para tentar entender como ele funciona. Há mais de 5 anos que eu procuro um exemplo/documentação de como configurar o Hibernate com configuração programática e nunca encontrei. Talvez até já tenha sido lançado recentemente, pois até o Spring se rendeu a configuração programática depois que começou a perder terreno para o Guice.

Se vc quer automatizar configuração programática via anotação, que tal fazer um método? Aí já caímos no gosto pessoal. Eu prefiro configuração programática e centralizada. Se vc quiser trocar a configuração anotada, como faz? Configuração separada, independente e centralizada é o que há, mas muitos vão continuar preferindo configuração espalhada e anotada. Mas o ponto não é esse, com o Hibernate vc não tem essa opção, pois vc não tem uma configuração baseado em código/DSL/API. Vc tem um conjunto de anotações que vc precisa aprender e domar para que a coisa funcione. Aguentei durante anos dezenas de requests, até dos membros do projeto Mentawai, para disponibilizar anotações, e a resposta sempre foi: nada contra quem quiser fornecer num jar/projeto separado anotações que configurem o framework. Podem até fornecer um jar que configure o framework via XML. O approach de configuração programática do framework suporta isso muito bem e é muito simples fazer isso. Mas de maneira nenhuma o framework vai suportar e estimular o uso de Annotations e XML. O approach é configuração programática, independente e separada (ou não) do jar do build principal. Fazendo isso bem feito qualquer um pode ter a liberdade de fazer o que quiser depois. Eu respondo dúvidas sobre configuração programática, nunca sobre XML, Annotations, JSON, TXT, etc.

[quote=saoj][quote=x@ndy]
Mas as anotações e o mapeamento via xml (que pessoalmente eu não gosto, pois torna o mapeamento complexo) não tem nada haver com configuração!"
[/quote]

Discordo. Anotação é configuração, um pouco melhor que XML, mas continua sendo markup e metadata. De código de programação não tem nada. Você consegue fazer um IF ou um LOOP com uma anotação?

Seguindo essa lógica eu poderia dizer que Java é código Assembly. Só porque uma coisa mais tarde vira outra, não significa que ela seja essa outra coisa. Annotation não é código, pelo menos para quem usa. Se o compilador faz ela virar código depois, isso não tem nada haver com quem está usando as anotações. Vc vai continuar tendo que entender e configurar as anotações bem certinho se não um abraço!

O Hibernate te entrega ANNOTATIONS ou XML para configurar. Ele NÃO te entrega uma API/DSL para vc configurar. Se vc quiser fazer sua própria annotation para configurar qualquer coisa no Hibernate, vc vai ter que olhar o código fonte do framework para tentar entender como ele funciona. Há mais de 5 anos que eu procuro um exemplo/documentação de como configurar o Hibernate com configuração programática e nunca encontrei. Talvez até já tenha sido lançado recentemente, pois até o Spring se rendeu a configuração programática depois que começou a perder terreno para o Guice.

Se vc quer automatizar configuração programática via anotação, que tal fazer um método? Aí já caímos no gosto pessoal. Eu prefiro configuração programática e centralizada. Se vc quiser trocar a configuração anotada, como faz? Configuração separada, independente e centralizada é o que há, mas muitos vão continuar preferindo configuração espalhada e anotada. Mas o ponto não é esse, com o Hibernate vc não tem essa opção, pois vc não tem uma configuração baseado em código/DSL/API. Vc tem um conjunto de anotações que vc precisa aprender e domar para que a coisa funcione. Aguentei durante anos milhares de requests, até dos membros do projeto Mentawai, para disponibilizar anotações, e a resposta sempre foi: nada contra quem quiser fornecer num jar/projeto separado anotações que configurem o framework. Podem até fornecer um jar que configure o framework via XML. O approach de configuração programática do framework suporta isso muito bem e é muito simples fazer isso. Mas de maneira nenhuma o framework vai suportar e estimular o uso de Annotations e XML. O approach é configuração programática, independente e separada (ou não) do jar do build principal. Fazendo isso bem feito qualquer um pode ter a liberdade de fazer o que quiser depois. Eu respondo dúvidas sobre configuração programática, nunca sobre XML, Annotations, JSON, TXT, etc.
[/quote]
Não disse que anotação é programação. Pare de distorcer o que eu digo. Eu disse que anotação é uma tarefa que deve ser cumprida pelo pelo compilador e que anotação não é configuração, só isso!
Você nunca vai encontrar um modo de “configurar” o hibernate com programação prográmatica por que o hibernate não é configurável. Nesses 5 anos você não percebeu isso? Não é muito estranho que uma ferramenta que usa configuração, não permita configuração?
O problema é que você acha que anotações são configurações e se em 5 anos pesquisando o hibernate você não percebeu isso, não vai ser eu que vou te convencer do contrário!

Para as pessoas que quiserem saber o que são anotações de uma lida em: http://download.oracle.com/javase/1,5.0/docs/guide/language/annotations.html. Ai verá que anotação não é configuração!

Cara, vc está muito emotivo e pouco racional. Anotação é muito diferente de configuração programática, mas parece que vc não quer aceitar isso. Ok, bola pra frente.

Olá,

Como dizia meu pai “Gosto e igual pescoço cada um tem um.”. Mas o objetivo da discussão é válido pois endendo que sempre devemos nos questionar sobre o caminho que tomamos e isso na nossa área se
refere a que tecnologia iremos usar para resolver um determinado problema.
Vou fazer algumas considerações sobre o que foi dito até o momento esperando que isso colabore com a discussão:

- Automatizar sem perder o controle
Entendo que para termos produtividade precisamos em certos momentos automatizar algumas atividades relacionados ao objeto da discussão(persistência). Programar tudo via código sem nenhuma
automação com certeza não será produtivo. O Hibernate nos propicia essa automação mas acaba de certa forma fazendo com que não tenhamos mais o controle do que está sendo executado. Por mais que
saibamos tudo sobre as configurações e HQL/Critéria (o que exige uma curva de aprendizado bem longa) nos deparamos constamente com problemas lançados pelo Hibernate e que não fazemos a mínima
idéia de como solucionar. Acabamos por vezes tendo que recorrer a depurar o código do Hibernate afim de descobrir o que está causando o problema(lentidão, exceptions que não informam claramente a
causa do problema, etc). Isso deixa de ser uma tarefa trivial e produtiva a partir do momento que por exemplo estamos numa fábrica de software onde o programador nem tem acesso a fazer esse
tipo de atividade e que com certeza essa atividade extra de debug acaba fazendo com que se leve mais tempo na produção final do sistema. Pra ficar mais claro minha colocação vou citar um exemplo
prático que passei no trabalho. Temos em nosso ERP muitas tabelas com milhões de registros e nos deparamos com problemas no sistema de NFe onde o Hibernate gera alguns SQL’s que realmente eu não
faria se fosse feito manualmente. Esses SQL’s colocados num plano de execução mostram a ineficiência de como foi montado. Gerando por vezes planos com FULL TABLE access para tabelas extremamente
grandes. Por mais que revisamos o modelo e configurações não conseguimos fazer nenhuma melhoria. Isso nos faz crer que realmente perdemos o controle. Talvez fosse ai o caso de escrever Native Query’s
do hibernate mas nesse caso começa o conflito entre performance x portabilidade. Quantas vezes já ouvimos discussões entre o DBA e o fornecedor do sistema com relação a lentidões provocadas
pelo SQL gerado pelo hibernate? Devemos concordar que com certeza o problema não é no banco, pois se não usamos os recursos que ele oferece como podemos exigir performance?

- Portabilidade[size=18] [/size]
Esse tema depende muito do objetivo a que se propõe o sistema desenvolvido. Se o alvo for clientes onde ele tem a opção de selecionar o banco de dados com certeza vamos precisar de
portabilidade. Em alguns momentos temos que sacrificar isso em função da performance, pois dificilmente vamos conseguir melhorias usando apenas o básico comum a todos os bancos.
O Hibernate assim como outros framework’s ORM vão propiciar portabilidade até o momento e que você precise assumir o controle e escrever coisas nativas/específicas para o banco em questão afim
de resolver problemas por exemplo de perfomance.

- Abandonar o que já aprendemos
Na nossa área em que no momento em que estou escrevendo este comentário tem milhares de pessoas criando mais tecnologias novas para que tenhamos que aprender seria um absurdo
jogar fora o conhecimento adquirido considerando que nem sempre o mercado nos dá o tempo suficiente para absorver novas tecnologias. Se pararmos para pensar em quanto tempo perdemos aprendendo o novo vamos
que isso se torna improdutivo. Por isso acredito que jogar fora o conhecimento de SQL que é justamente a linguagem mais difundida de banco de dados é como dar um tiro no pé. O ideal seria poder continuar usando o SQL
mas sem abdicar do novo. Poder usar SQL com OO. Pensando em termos de negócio se procurar alguém para ser contratado para nossa área veja quantos sabem SQL e quantos sabem HQL?
Acho que o novo deve ser testado e avaliado com certeza.

- Escolha da ferramenta/framework correto:
Já ouvi muito isso: “Usar um canhão para matar uma formiga.” A escolha depende muito do contexto do projeto. Depende se a empresa já usa uma tecnologia e não quer trocar. Se você tem a
abertura de testar e avaliar deve fazer isso com certeza. Não devemos ser muito religiosos a ponto de defender apenas uma ferramenta e não nos deixar avaliar outras.

- Configuração Programática x Configuração Annotation/XML
Não vejo diferença entre elas. As duas formas exigem que você aprenda ou sobre as anotações/XML ou sobre a API de configuração. Vejo apenas uma vantagem em configuração programática
em função de fazer com que suas classes de negócio sejam limpas e não dependam de tecnologia A ou B(classe de negócio com Annotation depende do jar das anotações). Com relação a desvantagem de
configuração programática existe o fato de que a cada nova mudança de configuração ela exige que o projeto seja recompilado e seja feito um novo redeploy.

- Troca de tecnologia as vezes é necessária
Com certeza a adoção de novas tecnologias em algum momento será necessária. Devemos trocar de tecnlogia apenas quando isso venha a trazer mais melhorias que possam resolver problemas
existentes ou que venha a nos acrescentar mais produtividade sem que com isso percamos o controle do que estamos fazendo. Já vi casos em fábricas de software em que a cada projeto novo se
adotava uma nova tecnlogia apenas como meio de aprendizado ou por modismo sem levar em consideração quanto tempo iria ser utilizada e quais os benefícios que ela irá trazer.
Não devemos nos fechar e simplesmente não aceitar que as coisas mudam. As vezes é preciso rever os conceitos.

- Clareza nas mensagens para o usuário do Framework
Quantas vezes já me deparei com framework’s ORM’s como o Hibernate que simplesmente nos lançam exceptions que não nos dizem onde está o problema. Quem aqui que nunca copiou e colou uma exception
do hibernate no google afim de descobrir o que significava que atire a primeira pedra. Enquanto isso deveria ser mais claro para o usuário do framework. Agora imagina se você não encontrou nada
sobre a exception no Google e ainda não tem os fontes do framework para fazer a indigesta tarefar de depurar para descobrir o que será que fez de errado. Ai como dizemos no trabalho: “Você tá na roça.”;

- Novas funcionalidades
Sejam bem vindas. Desde que não sejam impostas e que se possa optar por usar ou não. Funcionalidades no caso do Hibernate como deleção em cascata, lazy load, lock, etc não são de uso obrigatório. Por
isso se achaemos que perdemos o controle fazendo uso dessas funcionalidades basta não usá-las e fazer isso programaticamente sem automação. As funcionalidades que geram produtividade sem
perca do controle e que sejam intuitivas a ponto de nos dizer o que está dando errado quando ocorre algum problema sempre serão bem vindas.

- Complexidade X Flexibilidade
Que todo sistema começa simples e se torna complexo isso é o padrão. Pois sempre vão ser acrescentadas novas funcionalidades no sistema. Agora o que não pode é se tornar complexo e dificil de
manter. Isso ocorre também na escolha de um framework ORM. Quem é que não quer novas funcionalidades? O que ningúem deseja é que essas novas funcionalidades venham como dizem por ai a “engessar” o uso
fazendo com que se torne complexo e muito menos flexível.

- Cache
Essa é uma funcionalidade interessante em frameworks ORM como o Hibernate. Ela só deixa de ser interessante quando ouvimos dizer que o Hibernate não gerou o melhor SQL mas conseguiu suprir essa
deficiência usando um Cache. Isso no meu modo de ver é uma adequação ténica e não realmente uma melhoria como uma funcionalidade. A coisa complica mais um pouco quando se usa o cache de segundo nível.
Até parece a web, onde criou-se originalmente o HTML e desde então vem sendo feitas novas adequações técnicas(gambiarra) em camadas. Ex: html, jsp, asp, dhtml, xhtml, flash, applet, etc,etc. Talvez com HTML5
isso melhore.

Como todo mundo aqui disse o que pensava o no final querendo se esquivar disse “Isso é apenas minha opinião pessoal.”. Eu também não poderia deixar de dizer “Isso também é minha opinião pessoal”.

Vamos deixar aqui então um questionamento que acho que devemos fazer. Qual seriam então os requisitos ideias para o framework que tanto procuramos, que atenda gregos e troianos?

Fica aqui minhas sugestões ou necessidades para tal framework:

  • Possibilidade de trabalhar com SQL e OO sem ter que aprender uma nova linguagem e abandonar o que já sabemos;
  • Ter funcionalidades como delete cascade, lazy load, transações, lock, cache, etc sem criar mais complexidade;
  • Permitir fazer select’s de objetos de forma parcial permitindo que o programador traga via SQL apenas os objetos que lhe interessam na árvore do objeto do principal Ex: trazer apenas nome da cidade no Objeto cidade de uma pessoa já que preciso apenas disso para apresentar na view. O Hibernate sempre vai trazer o objeto completo. Em muitos casos não precisamos dessa abordagem. O Objeto principal queremos de forma completa mas os relacionamentos normalmente precisamos mostrar apenas uma outra propriedade;
  • Permtir configuração tanto via anotação/xml como programáticamente;
  • Permitir que novas funcionalidades sejam opcionais e não impostas;
  • Facilitar configuração dos relacionamentos. (Quem aqui que nunca se confundiu qual anotação usar OneToMany ou ManyToOne???
  • Facilidade de Integração com outros frameworks como Spring, Guice, etc. Trazer exemplos disso ou ferramentas que façam isso;
  • Ferramentas(plugins) que facilitem a criação de novos projetos usando o framework pois não temos obrigação de saber configurar tudo isso sozinho e nem advinhar como foi feito;
  • Ferramentas(plugins) que permitam executar SQL’s e ver os objetos retornados e não o resultset. Permitindo navegar e inspecionar tais objetos sem ter que necessariamente
    fazer uma aplicação para isso. Quem aqui que nunca fez um HQL sem saber se o resultado seria o desejado e teve que executar várias a aplicação pra ver como isso comporta.
    (Hibernate tem HibernateTools que nos mostra os objetos mas não tem como ver as propriedades dos mesmos além de que diz que suporta querys nativas
    mas no plugin não permite usar sql e sim somente HQL e critéria). Talvez tenha query nativa somente para dizer que tem;
  • Ferramentas(plugins) que permitam editar configurações de forma visual o que torna mais produtivo;
  • Ferramentas(plugins) que permitam fazer engenharia reverso do banco com interação do usuário para resolver problemas como mapeamento de herança e não gerar o modelo simplesmente como tá no banco;
  • Criar expressões para compor um SQL de forma que possamos por exemplo usar um nome de função igual pra todos os bancos e quando for executar trocar a expressão pela função nativa do banco.
    Permitindo com isso que tenhamos de certa forma uma maneira de melhorar a portabilidade. Isso também poderia se aplicar a sugestão de indices no sql o que melhora a performance mas que
    tem sintaxe diferente em bancos de dados diferentes. Fazendo com isso que consigamos melhorar a portabilidade e performance sem perder o controle;
  • Ferramenta(plugin) que permita comparação entre o modelo OO e o banco e aponte as diferenças visualmente;
  • Ferramenta(plugin) que permita edição SQL com auto complete de todos objetos do modelo de negócios;

Espero que possamos continuar a discussão e que vocês também possar colocar aqui o que esperam de um framework ideal para persistência.

:thumbup:

Edson Martins
Gerente de Tecnologia
A.J.Rorato
edson@ajrorato.ind.br

JDBC puro
very easy

Não é verdade. Vc está confundindo configuracão programática com Annotations. Configuracao programática é centralizada numa classe a parte. Ela é compilada a parte e pode ser distribuída a parte. Vc pode ter por exemplo o jar da aplicacao e dezenas de outros jars com configuracoes diferentes: config1.jar, config2.jar, etc.

Configuracao programática é a BASE. Com ela vc faz qualquer coisa que quiser. Vc transforma ela em que vc quiser. Não te agradou, abstrai. Cria métodos, loops, ifs, uma outra API por cima, automatiza, cria uma representacao em XML, JSON, TXT, HDF5, Annotations, properties, etc. Agora se um framework te dá um TXT para configurar relacionamentos vc terá problemas.

Se vc não quer ter que compilar sua configuracao (bobeira na minha opinião), vc pode usar Jython ou JRuby, importar as classes do Java e fazer a sua configuracao em Python ou Ruby.

Acho que essas coisas podem e devem ser controladas no nível da aplicacão, ao invés de no nível da configuracão e da mágica.

Delete cascade = vc cria uma transacao que deleta tudo o que vc precisa.

lazy loading = lazy loading tem que ser o padrão. E vc monta o seu objeto a medida que for precisando dele. Ou faz o seu DAO retornar tudo se quiser, o que é raramente necessário. O Hibernate oferece lazy loading automatíco, para que o programador não tenha que “se preocupar” com isso. Um tiro no pé na minha opinião. Muita mágica e o cara não sabe o que está acontecendo até ele tomar um LazyInitiationException. Discussão completa aqui: http://www.guj.com.br/java/57590-ser-lazy-preguicoso-ou-nao-ser

transacoes = isso não tem mistério nenhum, a não ser nos raríssimos casos de two-phase commit

lock = use o lock nativo do banco: select for update. Complicar isso pra quê?

cache = a aplicacão está em melhores condicoes de controlar isso, não o ORM tentar adivinar o que precisa de cache e o que não precisa. Vc pode usar um cache distribuído. Claro que o Hibernate também suporta Memcache, via mágica, annotations e AOP. Vc configura e passa a funcionar sabe-se lá deus como.

Bons comentários, Edson.

Nunca usei nem li a respeito do MentaBean, mas não duvido que seja bom, até gostei daquela configuração programática. O que eu não achei legal foi promovê-lo em cima de argumentos muitas vezes falaciosos a respeito do framework de persistência mais robusto do mercado. O Hibernate é um verdadeiro canhão, faz coisas que a gente nem sabe, então pra quê arrumar essa briga desnecessária? Não era mais fácil chegar e dizer “meu framework é tal e se propõe a resolver os problemas A, B e C”. O MentaBean não é nem nunca vai ser um substituto do Hibernate. Ele é apenas uma opção a mais.

[quote=fabiocsilva]Nunca usei nem li a respeito do MentaBean, mas não duvido que seja bom, até gostei daquela configuração programática. O que eu não achei legal foi promovê-lo em cima de argumentos muitas vezes falaciosos a respeito do framework de persistência mais robusto do mercado. O Hibernate é um verdadeiro canhão, faz coisas que a gente nem sabe, então pra quê arrumar essa briga desnecessária? Não era mais fácil chegar e dizer, “meu framework é tal e se propõe a resolver os problemas A, B e C”. O MentaBean não é nem nunca vai ser um substituto do Hibernate. Ele é apenas uma opção a mais.
[/quote]

Não estou preocupado com o MentaBean. Esquece o MentaBean. Ele é um lixo. Nos lugares que eu falei MentaBean vc pode trocar por iBatis. Não sou louco nem quero competir com o Hibernate. Quero apenas defender o meu ponto de vista com argumentos. Se vc acha que os meus argumentos são falaciosos, fica a vontade para expor os seus.

O MentaBean e o iBatis pregam uma filosofia diferente do approach do Hibernate. Esse é o ponto da discussão, não framework A,B ou C.

Em tempo: Retirei a mencão ao MentaBean do meu ultimo post.

Isso eu concordo! Todas as discussões aqui deveriam ser baseadas em argumentos!

Att.

[quote=saoj][quote=fabiocsilva]Nunca usei nem li a respeito do MentaBean, mas não duvido que seja bom, até gostei daquela configuração programática. O que eu não achei legal foi promovê-lo em cima de argumentos muitas vezes falaciosos a respeito do framework de persistência mais robusto do mercado. O Hibernate é um verdadeiro canhão, faz coisas que a gente nem sabe, então pra quê arrumar essa briga desnecessária? Não era mais fácil chegar e dizer, “meu framework é tal e se propõe a resolver os problemas A, B e C”. O MentaBean não é nem nunca vai ser um substituto do Hibernate. Ele é apenas uma opção a mais.
[/quote]

Não estou preocupado com o MentaBean. Esquece o MentaBean. Ele é um lixo. Nos lugares que eu falei MentaBean vc pode trocar por iBatis. Não sou louco nem quero competir com o Hibernate. Quero apenas defender o meu ponto de vista com argumentos. Se vc acha que os meus argumentos são falaciosos, fica a vontade para expor os seus.

Em tempo: Retirei a mencão ao MentaBean do meu ultimo post.[/quote]

Bom, muito já foi dito aqui sobre o Hibernate, só vou dar alguns pitacos. A relação Robustez x Flexibilidade x Time to Market dele é excelente e muito maior do que o do iBatis e seus pares. Além disso, há a questão da comunidade, dos projetos paralelos como o Hibernate Validator, da documentação, enfim, tudo o que se espera de um framework maduro. No caso do iBatis, acredito que o principal problema que ele se propõe a resolver é a otimização das consultas. Tudo bem, as vezes o Hibernate não gera o código que escreveríamos usando sql puro. Mas você tem a opção de escrever SQL nativo se não concordar com a geração automática. Aliás você tem a opção de fazer tudo manualmente, à sua maneira. iBatis muitas vezes soa para mim como otimização prematura.

[quote=fabiocsilva][quote=saoj][quote=fabiocsilva]Nunca usei nem li a respeito do MentaBean, mas não duvido que seja bom, até gostei daquela configuração programática. O que eu não achei legal foi promovê-lo em cima de argumentos muitas vezes falaciosos a respeito do framework de persistência mais robusto do mercado. O Hibernate é um verdadeiro canhão, faz coisas que a gente nem sabe, então pra quê arrumar essa briga desnecessária? Não era mais fácil chegar e dizer, “meu framework é tal e se propõe a resolver os problemas A, B e C”. O MentaBean não é nem nunca vai ser um substituto do Hibernate. Ele é apenas uma opção a mais.
[/quote]

Não estou preocupado com o MentaBean. Esquece o MentaBean. Ele é um lixo. Nos lugares que eu falei MentaBean vc pode trocar por iBatis. Não sou louco nem quero competir com o Hibernate. Quero apenas defender o meu ponto de vista com argumentos. Se vc acha que os meus argumentos são falaciosos, fica a vontade para expor os seus.

Em tempo: Retirei a mencão ao MentaBean do meu ultimo post.[/quote]

Bom, muito já foi dito aqui sobre o Hibernate, só vou dar alguns pitacos. A relação Robustez x Flexibilidade x Time to Market dele é excelente e muito maior do que o do iBatis e seus pares. Além disso, há a questão da comunidade, dos projetos paralelos como o Hibernate Validator, da documentação, enfim, tudo o que se espera de um framework maduro. No caso do iBatis, acredito que o principal problema que ele se propõe a resolver é a otimização das consultas. Tudo bem, as vezes o Hibernate não gera o código que escreveríamos usando sql puro. Mas você tem a opção de escrever SQL nativo se não concordar com a geração automática. Aliás você tem a opção de fazer tudo manualmente, à sua maneira. iBatis muitas vezes soa para mim como otimização prematura.[/quote]
Concordo plenamente contigo, e faço um complemento.

Da forma como foi colocado aqui parece que o hibernate é lento, as anotações são ruins, HQL e Crirteria são monstros de sete cabeça e ele e só gera um monte de exceções. Mas isso são falácias. O Hibernate trabalha bem em 95% dos casos. O problema é justamente os 5% restantes, mas não existe ferramenta perfeita. O Hibernate não é bala de prata! Você vai trabalhar bem com ele durante muito tempo, mas em alguns casos você vai ter problemas, mas esses casos são raros! Nesses casos você faz como o fabiocsilva falou.

Gostar de mais de uma ferramenta do que outra não é o problema. O problema é atacar a outra ferramenta de forma falaciosa para promover a sua.

Se o Hibernate é tão ruim assim porque ele é tão utilizado? Por que as pessoas são obrigadas? Eu uso o hibernate/jpa e recomendo o seu uso e ninguém me obrigou a isso. Conheço outras programadores que fazem o mesmo e até agora não conheci ninguém que conhecesse e não gostasse. Então quem nos obrigou?
“Ah, as pessoas só usam porque é padrão de mercado”! Mas como ele se tornou um padrão? Sendo ruim é que não foi então sobra a opção que foi feita uma conspiração pelas grandes empresas para secretamente convencer os programadores que ele é bom, mesmo sendo ruim? Mas essas empresas estão interessadas no lucro, então porque vão promover uma tecnologia inferior? Dizer que o hibernate é ruim é uma falácia enorme. Não gostar como hibernate faz as coisas ai tudo bem, gosto não se discute mesmo.

Eu acho o hibernate mais produtivo do fazer o mapeamento programaticamente e quando ele não atende minhas necessidades eu utilizo outra ferramenta, ou faço o mapeamento a mão mesmo!

Essa discussão me lembra as que eu cansei de ouvir sobre linguagem de programação. Java é melhor que Delphi, Delphi é melhor que java. C é melhor que qualquer outra linguagem!
Eu programa nas 3 e sei que nenhuma delas é melhor que a outra. Uso cada uma conforme o que eu tenho que fazer! A ferramenta certa para o problema certo. E isso se aplica aos frameworks ORM!

Eu já coloquei os meus argumentos. Resumindo: Para o cara que sabe SQL e quer ter controle e flexibilidade o Hibernate é muita mágica, muito peso e muitos problemas sim.

Eu vou encerrar a discussão com o x@andy por aqui por que lendo as suas mensagens vejo que ele tem um amor muito grande pelo Hibernate e suas respostas estão pouco técnicas e muito emotivas.

Ok, mas há outros caminhos, há pessoas que pensam diferente, há o iBatis, há milhões de problemas e dúvidas diariamente sobre o Hibernate, etc.

Vc deveria ler mais Nelson Rodrigues: “Toda a unanimidade é burra!” E o Hibernate é uma unanimidade.

O problema não é o Hibernate, mas sim o que ele se preza a fazer. Acho que vc não sabe a diferença de eficiente para eficaz.

Esse tópico em nada vai mudar o fato de que Hibernate + Spring continuarão a ser o stack padrão do Java. Apenas vai abrir o olho das pessoas que as coisas podem ser feitas de maneira diferente.

Parabéns !!!

O MentaBean é um lixo. Esquece ele. Eu o fiz apenas para demonstrar o meu ponto de vista alternativo. Vc pode entender esse tópico como a diferença de approaches entre Hibernate e iBatis. Acho que isso vai te deixar mais tranquilo. Agora se as pessoas quiserem usar, é como vc falou. Cada um usa o que quizer e o que julgar melhor, não o que o mercado ou a unanimidade lhe empurrarem goela abaixo! Até porque quando o Hibernate surgiu a unanimidade e o padrão era EJB1 com EntityBeans. :wink:

Os argumentos foram apresentados, de maneira clara. Vc também apresentou os seus, na medida do possível. Agora cada um tira suas próprias conclusões e decide o que é falácia, o que é paixão e o que faz sentido.