Pergunta

Eu estou familiarizado com ORM como um conceito, e eu usei mesmo nHibernate há vários anos para um projeto .NET; no entanto, eu não acompanharam com o tema da ORM em Java e não tive a chance de usar qualquer uma dessas ferramentas.

Mas, agora eu possa ter a chance de começar a usar algumas ferramentas ORM para um de nossos aplicativos, em uma tentativa de se afastar de uma série de serviços web legados.

Estou tendo um tempo difícil dizer a diferença betweeen a especificação JPA, o que você ganha com a própria biblioteca Hibernate, eo que JDO tem para oferecer.

Então, eu entendo que esta questão é um pouco aberto, mas eu estava esperando para obter algumas opiniões sobre: ??

  • Quais são os prós e contras de cada um?
  • O que você sugere para um novo projeto?
  • Existem certas condições que não faria sentido usar um framework contra o outro?
Foi útil?

Solução

Algumas notas:

  • JDO e JPA são ambas as especificações, não implementações.
  • A idéia é que você pode trocar implementações JPA, se você restringir o seu código para usar apenas JPA padrão. (Idem para JDO.)
  • O Hibernate pode ser usado como um tal implementação de JPA.
  • No entanto, o Hibernate oferece uma API nativa, com características acima e além que de JPA.

IMO, eu recomendaria Hibernate.


Tem havido alguns comentários / perguntas sobre o que você deve fazer se você necessidade para utilizar funcionalidades específicas do Hibernate. Há muitas maneiras de olhar para isso, mas o meu conselho seria:

  • Se você não está preocupado com a perspectiva de fornecedor tie-in, em seguida, fazer a sua escolha entre Hibernate, e outros JPA e implementações JDO incluindo as várias extensões fornecedor específico em sua tomada de decisão .

  • Se você está preocupado com a perspectiva de tie-in vendedor, e você não pode usar JPA sem recorrer a extensões fornecedor específico, então não use JPA. (Idem para JDO).

Na realidade, você provavelmente terá que trade-off quanto você está preocupado com fornecedor tie-in contra quanto você precisa dessas extensões específicas do fornecedor.

E há outros fatores também, como o quão bem você / sua equipe conhecer as respectivas tecnologias, quanto os produtos vão custar em licenciar, e cuja história você acredita sobre o que vai acontecer no futuro para JDO e JPA.

Outras dicas

Certifique-se de avaliar a implementação DataNucleus de JDO. Nós começamos com Hibernate, porque parecia ser tão popular, mas logo percebeu que não é uma solução persistência transparente 100%. Há também muitas advertências ea documentação está cheio de 'se você tem essa situação, então você deve escrever o seu código como este', que tirou a diversão de modelagem e codificação no entanto queremos livremente. JDO tem não causou-me para ajustar o meu código ou meu modelo para fazê-lo 'trabalho adequadamente'. Eu só posso projetar e POJOs código simples como se eu estava indo para usá-los 'na memória' apenas, mas eu pode persistir los de forma transparente.

A outra vantagem de JDO / DataNucleus ao longo de hibernação é que ele não tem toda a reflexão sobrecarga tempo de execução e é mais memória eficiente porque usa realce código byte tempo de construção (talvez adicionar 1 segundo ao seu tempo de compilação para um grande projeto), em vez de tempo de execução reflexão alimentado padrão de procuração da hibernação.

Outra coisa que você pode encontrar irritante com Hibernate é que uma referência que você tem que o que você pensa é o objeto ... é muitas vezes um 'proxy' para o objeto. Sem o benefício da melhoria código de bytes do padrão de proxy é necessária para permitir que a carga de demanda (ou seja, evitar puxar em seu gráfico de objeto inteiro quando você puxa em um nível objeto superior). Esteja preparado para iguais substituir e hashcode porque o objeto você acha que é referência muitas vezes é apenas um proxy para esse objeto.

Aqui está um exemplo de frustrações que você vai ter com Hibernate que você não vai ficar com JDO:

http: //blog.andrewbeacock .com / 2008/08 / how-to-implementar-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53

Se você gosta de codificação para 'soluções', então, com certeza, Hibernate é para você. Se você aprecia orientada a objeto impulsionada modelo de desenvolvimento limpo, puro, onde você gasta todo o seu tempo na modelagem, design e codificação e nada disso em soluções feias, em seguida, passar algumas horas avaliando JDO / DataNucleus . As horas investidas será reembolsado mil vezes.

Atualização de fevereiro 2017

Por algum tempo agora implementos DataNucleus' o padrão JPA persistência para além da JDO persistência padrão para que portar projectos JPA existentes de Hibernate para DataNucleus deve ser muito simples e você pode obter todos os benefícios acima mencionados de DataNucleus com muito pouca alteração de código, se houver. Assim, em termos da questão, a escolha de um padrão particular, JPA (RDBMS somente) vs JDO (RDBMS + Sem SQL + ODBMSes + outros), DataNucleus suporta tanto, Hibernate é restrito a JPA somente.

Desempenho de Hibernate DB atualizações

Outra questão a considerar ao escolher um ORM é a eficiência do seu mecanismo de checagem suja - que se torna muito importante quando se precisa para construir o SQL para atualizar os objetos que foram alterados na transação atual - especialmente quando há um monte de objetos. Há uma descrição técnica detalhada do mecanismo sujo verificação do Hibernate nesta resposta SO: JPA com Hibernate inserção muito lento

Tenho recentemente avaliado e escolhido um framework de persistência para um projeto java e as minhas conclusões são as seguintes:

O que eu estou vendo é que o apoio em favor de JDO é principalmente:

  • você pode usar fontes de dados não-SQL, db4o, HBase, LDAP, Bigtable, couchdb (plugins para Cassandra) etc.
  • você pode facilmente mudar de uma sql para fonte de dados não-SQL e vice-versa.
  • nenhum objeto proxy e, portanto, menos dor com relação ao hashCode () e equals () implementações
  • mais POJO e, portanto, menos soluções alternativas necessário
  • suporta mais relacionamento e tipos de campo

e o apoio em favor de APP é principalmente:

  • mais populares
  • JDO está morto
  • uso does not bytecode realce

Eu estou vendo um monte de mensagens pró-JPA de desenvolvedores da APP que claramente não usaram JDO / DataNucleus oferecendo argumentos fracos para não usar JDO.

Também estou vendo um monte de mensagens de usuários JDO que migraram para JDO e são muito mais feliz como resultado.

No que respeita à JPA ser mais popular, parece que isso se deve em parte devido ao suporte do fornecedor RDBMS vez de ser tecnicamente superior. (Soa como VHS / Betamax para mim).

JDO e da implementação de referência DataNucleus claramente não é morto, como mostrado por adoção do Google dele para GAE e desenvolvimento ativo no código-fonte (http://sourceforge.net/projects/datanucleus/).

Eu tenho visto uma série de queixas sobre JDO devido ao aumento bytecode, mas nenhuma explicação ainda para por que é ruim.

De fato, em um mundo que está se tornando mais e mais obcecado por soluções NoSQL, JDO (ea implementação DataNucleus) parece uma aposta muito mais seguro.

Eu só comecei a usar JDO / DataNucleus e tê-lo configurado para que eu possa alternar facilmente entre usando db4o e mysql. É útil para o desenvolvimento rápido para uso db4o e não tem que se preocupar muito sobre o esquema de banco de dados e, em seguida, uma vez que o esquema é estabilizado para implantar um banco de dados. Eu também me sinto confiante de que, mais tarde, eu poderia implementar toda a parte / da minha candidatura para GAE ou tirar proveito de armazenamento distribuído / Map-Reduce a la hbase / hadoop / Cassandra sem muita refatoração.

Eu encontrei o obstáculo inicial de começar com DataNucleus um pouco complicado - a documentação no site do DataNucleus é um pouco difícil de entrar - os tutoriais não são tão facilmente seguir como eu teria gostado. Dito isto, a documentação mais detalhada sobre a API e mapeamento é muito bom quando chegar após a curva de aprendizado inicial.

A resposta é, depende do que você quer. Eu preferiria ter um código mais limpo, não-vendor lock-in, mais orientada para o POJO, opções NoSQL versos mais popular.

Se você quer a sensação exigente quente que você está fazendo o mesmo que a maioria dos outros desenvolvedores / ovelhas, escolha JPA / Hibernate. Se você quiser levar em seu campo, test drive JDO / DataNucleus e fazer a sua própria mente.

O que você sugere para um novo projeto?

Eu sugeriria não! JdbcTemplate de uso Primavera DAO juntamente com StoredProcedure, RowMapper e RowCallbackHandler vez.

A minha própria experiência pessoal com Hibernate é que o tempo economizado up-front é mais do que compensado pelos intermináveis ??dias você vai gastar para baixo da linha tentar compreender e depurar problemas como o comportamento de atualização em cascata inesperado.

Se você estiver usando um banco de dados relacional, em seguida, quanto mais próximo o seu código é que, mais controle você tem. camada DAO de mola permite um controle fino da camada de mapeamento, enquanto eliminando a necessidade de código padrão. Além disso, ele integra camada de transação do Spring que significa que você pode facilmente adicionar (via AOP) complicado comportamento transacional sem essa intrusão em seu código (é claro, você tem isso com Hibernate também).

JDO está morto

JDO não está morto, na verdade, portanto, verifique seus fatos. JDO 2.2 foi lançado em outubro de 2008 JDO 2.3 está em desenvolvimento.

Este é desenvolvida abertamente, sob o Apache. Mais lançamentos que JPA teve, e sua especificação ORM é ainda antes de até mesmo as características JPA2 proposta

JDO é ter recursos avançados do que JPA ver http://db.apache.org/jdo/ jdo_v_jpa.html

Eu estou usando JPA (implementação OpenJPA da Apache, que é baseado no código base KODO JDO que é 5+ anos e extremamente rápido / confiável). IMHO qualquer um que lhe diz para ignorar as especificações está lhe dando maus conselhos. I colocar o tempo e foi definitivamente recompensado. Com qualquer JDO ou JPA você pode mudar de fornecedores com alterações mínimas (JPA tem mapeamento ORM assim que nós estamos falando menos de um dia para possivelmente fornecedores de mudança). Se você tem 100 + tabelas como eu fazer isso é enorme. Além de conseguir built0in cache com despejos cluster cache-wise e tudo é bom. SQL / JDBC é bom para consultas de alto desempenho, mas a persistência transparente é muito superior para escrever seus algoritmos e rotinas de entrada de dados. Eu só tenho cerca de 16 consultas SQL em todo o meu sistema (50k + linhas de código).

Qualquer um que diz que JDO está morto é um traficante astroturfing FUD e eles sabem disso.

JDO está vivo e bem. A especificação é ainda mais poderoso, amadurecer e avançado do que o JPA muito mais jovem e constrangidos.

Se você quiser limitar-se a apenas o que está disponível no padrão JPA você pode escrever para JPA e utilizar DataNucleus como um alto desempenho, implementação persistência mais transparente do que as outras implementações de JPA. Claro DataNucleus também implementa o padrão JDO se quiser que a flexibilidade e eficiência de modelar que JDO traz.

Eu estive olhando para isso mesmo e não pode encontrar uma forte diferença entre os dois. Acho que a grande escolha é do início da aplicação que você usa. Para mim eu estive considerando o href="http://www.datanucleus.org/" rel="noreferrer"> DataNucleus plataforma , pois é uma loja de dados implementação agnóstico de ambos.

Eu usei Hibernate (implementação JPA) e JPOX (implementação JDO) no mesmo projeto. JPOX trabalhou ok, mas funcionou em erros rapidamente, lá onde alguns Java 5 recursos de linguagem que não apoiou no momento. Ele teve problemas para jogar agradável com transações XA. Eu estava gerando o esquema de banco de dados a partir dos objetos JDO. Ele queria se conectar a um banco de dados cada vez que é irritante se sua conexão com a Oracle não acontece estar funcionando.

Em seguida, mudou para Hibernate. Nós brincou ao redor com apenas usando JPA puro por algum tempo, mas precisávamos de usar algumas das características específicas do Hibernate para fazer o mapeamento. Executando o mesmo código em vários bancos de dados é muito fácil. Hibernate parece cache de objetos de forma agressiva ou apenas ter comportamento de cache estranho às vezes. Há alguns DDL constrói Hibernate não pode lidar e por isso eles são definidos em um arquivo adicional que é executado para inicializar o banco de dados. Quando eu correr em um problema Hibernate muitas vezes há muitas pessoas que foram executados para o mesmo problema que faz googling para soluções mais fáceis. Finalmente, Hibernate parece ser bem projetado e confiável.

Alguns outros respondentes sugeriram apenas usando SQL. O caso de uso verdadeiro assassino para mapeamento objeto relacional é o teste e desenvolvimento. As bases de dados que são construídos para lidar com grandes volumes de dados são tipicamente caro e ou eles são difíceis de instalar. Eles são difíceis de testar com. Há uma abundância de bancos de dados Java na memória que podem ser usados ??para teste com, mas são tipicamente inútil para a produção. Ser capaz de usar um real, mas banco de dados limitado, vai aumentar a produtividade de desenvolvimento e confiabilidade código.

Eu fiz uma WebApp amostra maio 2012 que usa JDO 3.0 & DataNucleus 3.0 - dê uma olhada o quão limpo é: https://github.com/TorbenVesterager/BadAssWebApp

Ok talvez seja um pouco demasiado limpo, porque eu uso os POJOs tanto para o banco de dados eo cliente JSON, mas é divertido:)

PS: Contém um SuppressWarnings algumas anotações (desenvolvidos em IntelliJ 11)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top