JPA 2: Hibernate ou EclipseLink?

JPA 2: Hibernate ou EclipseLink?
lacerdaph
lacerdaph

Compartilhe

Qual implementação de JPA você utiliza? Bom, durante muito tempo achei que a resposta automática para esta pergunta seria Hibernate, porém este ano fiz uma migração de um sistema grande que estávamos usando Hibernate para o EclipseLink. A escolha para o Hibernate era clara, experiência da equipe, aplicação rodando em WildFly, a princípio, melhor desempenho e por aí vai. Agora, por que trocamos de implementação? Vou responder esta pergunta com uma série de posts. Neste vou abordar sobre curiosidades nas diferenças das duas implementações. Os testes foram feitos usando Ubuntu, MySql, EclipseLink 2.6 e Hibernate 4.3.8 em um ambiente JavaSE. Mas não deixe de conhecer outras como OpenJPA e Batoo, sendo que esta última possui benchmarks até melhores que o Hibernate.

O primeiro item que muitos alunos me perguntam é relacionado à perfomance. Bom, quanto a isso [não vou me](http://blog.eisele.net/2009/01/jpa-implementations-comparison.html  ) aprofundar muito pois já existem inúmeros trabalhos, maioria até mesmo acadêmicos, como TCC´s. Existe até mesmo artigo comparado JPA com o finado JDO. Em suma, o hibernate costuma ter um desempenho melhor, mas com certeza vale a pena dar uma lida nesta coleção .

Para mostrar algumas curiosidades, vamos usar a relação entre Conta e Movimentação. O pseudo-código abaixo representa a relação.

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!
 @Entity class Conta{

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @OneToMany (mappedBy="conta") private List<Movimentacao> movimentacoes; } @Entity class Movimentacao{

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @ManyToOne private Conta conta; } 

Vamos lá.

- Como habilitar os Logs?

Esta é uma propriedade que ainda não foi especificada, logo cada implementação tem a sua.

Hibernate:

EclipseLink:

- Devo declarar no persistence.xml?

Bom, aqui já tem diferença. O Hibernate deixa que o mapeamento seja feito apenas através do @Entity, porém o EclipseLink exige que a classes também sejam mapeadas via no persistence.xml.

 

 

- Como gerar a base a partir do modelo?

No JPA 2.1 já houve uma padronização deste parâmetro, agora basta usar a propriedade javax.persistence.schema-generation.database.action. Ela possui 4 valores: create, drop-create, none, drop.

E além disso, foi especificado também a propriedade javax.persistence.schema-generation.scripts.create-target, que permite gerar os arquivos de DDL.Agora

As duas implementações oferecem suporte, entretanto possuem comportamentos diferentes.

EclipseLink: com o banco de dados vazio, ao usar a opção create e rodar o programa, o resultado é a criação da base de dados. Ao inserir uma nova @Entity e rodar novamente o programa, a implementação atualiza a base.

Hibernate: Nestas mesmas condições, ele cria a base na primeira execução, mas na segunda execução ele falha pois tenta criar novamente as mesmas tabelas e falha pois já estão criadas.

A especificação não deixa claro qual deveria ser o comportamento.

Aqui também é importante ressaltar uma outra diferença que impacta diretamente na portabilidade. O EclipseLink gera as tabelas com letras maiúsculas e o Hibernate seguindo o padrão de nome da Classe.

Um outro ponto a ressaltar é que a DDL do EclipseLink é muito mais amigável que a do Hibernate.

EclipseLink: CREATE TABLE MOVIMENTACAO (ID INTEGER AUTO_INCREMENT NOT NULL, VALOR DOUBLE, CONTA_ID INTEGER, PRIMARY KEY (ID)) ALTER TABLE MOVIMENTACAO ADD **CONSTRAINT FK_MOVIMENTACAO_CONTA_ID** FOREIGN KEY (CONTA_ID) REFERENCES CONTA (ID) Hibernate: create table MOVIMENTACAO (id integer not null auto_increment, valor double precision not null, conta_id integer, primary key (id)) alter table MOVIMENTACAO **add constraint FK_pf1tg6j429i17rjrp0pmbw6a3** foreign key (conta_id) references CONTA (id)

 

Bom, esta foi a primeira parte, na segunda parte vou discutir sobre diferenças ao persistir objetos, pesquisas, relacionamentos LAZY e como lidar com o weaving. Aqui na Caelum já falamos muito sobre JPALazy Loading, trabalhos Batch, boas práticas e muitos outros artigos, não deixe de ler, assim como acompanhar apresentações que sempre acontecem sobre a tecnologia e o excelente livro do Hebert (desenvolvedor da DSL Easy Criteria) publicado pela casa do código. Não deixe de comentar e até o próximo post.

 

ps: Bom, hoje é uma data especial pra mim, por isso aproveito o espaço para lançar um desafio aos companheiros da Caelum e quem tiver afim de embarcar nesta. #façaUmPostNoSeuAniversário

Veja outros artigos sobre Programação