ORM para Java: Comparação e exemplos
ORM (Object-Relational Mapping) — é uma tecnologia que conecta o modelo orientado a objetos do Java com bancos de dados relacionais. Ela elimina a necessidade de escrever código SQL repetitivo e permite trabalhar com dados como objetos Java comuns. Em Java, as três abordagens mais populares são: Hibernate (ORM completo), MyBatis (mapeador SQL) e JPA (padrão Java). Neste artigo, vamos compará-las com exemplos práticos.
1. JPA (Java Persistence API)
JPA — é uma especificação (padrão), não uma implementação concreta. A implementação mais popular é o Hibernate, mas existem outras (EclipseLink, OpenJPA). JPA fornece anotações para mapeamento de entidades e suporta JPQL (Java Persistence Query Language).
Exemplo de entidade JPA:
import javax.persistence.*;
@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(name = "username", nullable = false, length = 50) private String username;
@Column(name = "email") private String email;
// getters e setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}Exemplo de salvamento via EntityManager:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");EntityManager em = emf.createEntityManager();
em.getTransaction().begin();User user = new User();user.setUsername("ivan");user.setEmail("ivan@example.com");em.persist(user);em.getTransaction().commit();
em.close();emf.close();2. Hibernate
Hibernate — é o ORM mais maduro e funcional para Java. Ele implementa completamente o JPA, mas também possui extensões próprias. Hibernate gera SQL automaticamente, gerencia cache, suporta lazy loading e operações em cascata.
Exemplo de mapeamento com Hibernate (usando anotações JPA):
import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity@Table(name = "orders")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Order { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "order_seq") @SequenceGenerator(name = "order_seq", sequenceName = "order_sequence", allocationSize = 1) private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user;
@Column(name = "total_amount") private Double totalAmount;
// getters e setters}Exemplo de consulta via Hibernate Criteria API:
Session session = sessionFactory.openSession();CriteriaBuilder builder = session.getCriteriaBuilder();CriteriaQuery<User> query = builder.createQuery(User.class);Root<User> root = query.from(User.class);query.select(root).where(builder.equal(root.get("username"), "ivan"));
List<User> users = session.createQuery(query).getResultList();session.close();3. MyBatis
MyBatis — não é um ORM completo, mas sim um Mapeador SQL. Ele não gera SQL automaticamente, mas fornece um mecanismo flexível para escrever consultas SQL próprias com mapeamento de resultados para objetos Java. MyBatis é ideal quando é necessário controle total sobre o SQL e desempenho.
Exemplo de mapeamento em XML (UserMapper.xml):
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User">\ Também na biblioteca
Internacionalização (i18n) em Java: guia completo com exemplos
Testes em Kotlin: frameworks e ferramentas para código de qualidade
Filas de Tarefas em Kotlin: Coroutines, KJob e Padrões Avançados
Processamento de Imagens em C++: resize e crop com a biblioteca OpenCV