A diferença entre JPA, Hibernate e EclipseLink
1. Introdução
Neste tutorial, discutiremos o Hibernate e a Java Persistence API (JPA) - com foco nas diferenças entre eles.
Estaremosstart by exploring what JPA is, how it’s used, and the core concepts por trás disso.
Então, daremos uma olhada em como o Hibernate e o EclipseLink se encaixam na imagem.
2. Mapeamento Objeto-Relacional
Antes de mergulharmos no JPA, é importante entender o conceito de Mapeamento Objeto-Relacional - também conhecido como ORM.
O mapeamento relacional de objetos é simplesmentethe process of persisting any Java object directly to a database table. Geralmente, o nome do objeto que está sendo mantido se torna o nome da tabela e cada campo dentro desse objeto se torna uma coluna. Com a tabela configurada, cada linha corresponde a um registro no aplicativo.
3. Uma introdução à JPA
A Java Persistence API, ou JPA, é uma especificação que define o gerenciamento de dados relacionais em um aplicativo Java. A API mapeia um conjunto de conceitos que define quais objetos no aplicativo devem ser mantidos e como devem persistir.
É importante notar aqui queJPA is only a specification and that it needs an implementation to work - mas maison that later.
Agora, vamos discutir alguns dos principais conceitos de JPA que uma implementação deve abranger.
3.1. Entidade
Ojavax.persistence.Entity class defines which objects should be persisted to the database. Para cada entidade persistida, o JPA cria uma nova tabela no banco de dados escolhido.
Além disso, todas as entidades escolhidas devem definir uma chave primária indicada pela anotação@Id . Junto com a nota sanitária@GeneratedValue , definimos que a chave primária deve ser gerada automaticamente quando o registro é persistido no banco de dados.
Vamos dar uma olhada em um exemplo rápido de uma entidade descrita por JPA.
@Entity
public class Car {
@GeneratedValue
@Id
public long id;
// getters and setters
}
Lembre-se de que, atualmente, isso não afetará o aplicativo - JPA não fornece nenhum código de implementação.
3.2. Persistência de campo
Another core concept of JPA is field persistence. Quando um objeto em Java é definido como uma entidade, todos os campos nele são automaticamente mantidos como colunas diferentes na tabela de entidades.
Se houver um campo dentro de um objeto persistente quedon’t pretendemos persistir no banco de dados, podemos declarar o campo transiente com a anotação@Transient .
3.3. Relacionamentos
A seguir,JPA specifies how we should manage relationships between different database tables em nosso aplicativo. Como vimos, o JPA lida com isso com anotações. Há quatro anotações de relacionamento que precisamos ter em mente:
-
@Um a um
-
@Um para muitos
-
@ManyToOne
-
@Muitos para muitos
Vamos dar uma olhada em como isso funciona:
@Entity
public class SteeringWheel {
@OneToOne
private Car car
// getters and setters
}
Em nosso exemplo acima, o escalãoSteeringWheel descreve um relacionamento um para um com nosso escalãoCar anterior.
3.4. Gerente de Entidade
Finalmente, ojavax.persistence.EntityManager class especifica as operações de e para o banco de dados. OsEntityManager contains common Create, Read, Update and Delete (CRUD) operations que sãopersisted para o banco de dados.
4. Implementações JPA
Com a especificação JPA definindo como e o que devemos persistir, agoraneed to choose an implementation provider to supply the necessary code. Sem tal provedor, precisaríamos implementar todas as classes relevantes para estar em conformidade com JPA, e isso é umlot de trabalho!
Existem muitos fornecedores para escolher, cada um exibindo seus próprios prós e contras. When making a decision no qual usar, devemosconsider a few of the following points:
-
Maturidade do projeto -*how long has the provider been around*, and how well documented is it?
-
Subprojetos -*does the provider have any useful subprojects* for our new application?
-
Apoio da comunidade -is there anyone to help us out when we end up with a critical bug?
-
Comparativo de mercado -*how performant* is the implementation?
Embora não iremos aprofundar no benchmarking de diferentes provedores de JPA,JPA Performance Benchmark (JPAB) contém informações valiosas sobre isso.
Com isso resolvido, vamos dar uma breve olhada em alguns dos principais fornecedores de JPA.
5. Hibernate
Em seu núcleo,Hibernate is an object-relational mapping tool that provides an implementation of JPA. Hibernate is one of the most mature JPA implementations ao redor, com uma enorme comunidade apoiando o projeto.
Ele implementa todos osjavax.persistence classes que vimos anteriormente no artigo, bem como fornece funcionalidade além do JPA -Hibernate tools,validation esearch. Embora essas APIs específicas do Hibernate possam ser úteis, elas não são necessárias em aplicativos que exigem apenas a funcionalidade JPA básica.
Vamos dar uma olhada rápida no que o Hibernate oferece com a anotação@Entity.
Ao cumprir o contrato JPA,@org.hibernate.annotations.Entity adds additional metadata that goes beyond JPA specification. Fazer isso permite o ajuste fino da persistência da entidade. Por exemplo, vamos dar uma olhada em algumas anotações oferecidas porHibernate that extends the functionality of @Entity:
-
@Table –allows us to specify the name of the table created for the entity
-
@BatchSize -specifies the batch size when retrieving entities from the table
Também vale a pena notar alguns dos recursos extras que o JPA não especifica, que podem ser úteis em aplicativos maiores:
-
Declarações CRUD personalizáveis com as notas de@SQLInsert, @SQLUpate and @SQLDelete
-
Suporte para exclusão suave
-
Entidades imutáveis com a anotação@Immutable
Para um mergulho mais profundo na persistência do Hibernate e do Java - vá para nossoSpring persistence tutorial series.
6. EclipseLink
EclipseLink, construído pela Eclipse Foundation,provides an open-sourced JPA implementation. Além disso, EclipseLinksupports a number of other persistence standards such as Java Architecture for XML Binding (JAXB).
Simplificando, em vez de persistir um objeto em uma linha do banco de dados, o JAXB mapeia-o para uma representação XML.
Em seguida, comparando a mesma implementação de anotação@Entity, vemos que o EclipseLink oferece novamentedifferent extensions. Embora não haja nenhuma anotação para @BatchSize como vimos anteriormente,EclipseLink offers other options that Hibernate doesn’t.
Por exemplo:
-
@ReadOnly - especifica que a entidade a ser persistida é somente leitura
-
@Struct – defines the class to map to a database ‘struct' type
Para ler mais sobre o que o EclipseLink tem a oferecer, vá para nossoguide on EclipseLink with Spring.
7. Conclusão
Neste artigo, temoslooked at the Java Persistence API, or JPA.
Finalmente, exploramoshow it differs from Hibernate and EclipseLink.