ORM para Java: comparación de Hibernate, MyBatis y JPA con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

ORM para Java: Comparación y ejemplos



ORM (Object-Relational Mapping) es una tecnología que vincula el modelo orientado a objetos de Java con bases de datos relacionales. Libera al desarrollador de escribir código SQL repetitivo y permite trabajar con datos como objetos Java comunes. En Java, los tres enfoques más populares son: Hibernate (ORM completo), MyBatis (mapeador SQL) y JPA (estándar de Java). En este artículo los compararemos con ejemplos prácticos.



1. JPA (Java Persistence API)

JPA es una especificación (estándar), no una implementación concreta. La implementación más popular es Hibernate, pero existen otras (EclipseLink, OpenJPA). JPA proporciona anotaciones para el mapeo de entidades y admite JPQL (Java Persistence Query Language).



Ejemplo de entidad 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 y 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; }}


Ejemplo de guardado mediante 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 es el ORM más maduro y funcional para Java. Implementa completamente JPA, pero también tiene sus propias extensiones. Hibernate genera SQL automáticamente, gestiona el almacenamiento en caché, admite carga diferida (lazy loading) y operaciones en cascada.



Ejemplo de mapeo con Hibernate (usando anotaciones 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 y setters}


Ejemplo de consulta mediante 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 no es un ORM completo, sino un mapeador SQL. No genera SQL automáticamente, sino que proporciona un mecanismo flexible para escribir sus propias consultas SQL con mapeo de resultados a objetos Java. MyBatis es ideal cuando se necesita control total sobre SQL y el rendimiento.



Ejemplo de mapeo en XML (UserMapper.xml):

<mapper namespace="com.example.mapper.UserMapper">    <select id="selectUser" resultType="User">\                    

Recommendations