Hibernate: Asociaciones entre entidades

Aprende a manejar asociaciones entre entidades en Hibernate. Guía actualizada para 2024 con ejemplos prácticos y recomendaciones.

En Hibernate, las asociaciones entre entidades se pueden clasificar principalmente en tres tipos:

  1. Uno a uno (One-to-One)
  2. Uno a muchos (One-to-Many)
  3. Muchos a muchos (Many-to-Many)

Asociación uno a uno

Una asociación uno a uno se utiliza cuando una entidad está relacionada con exactamente una instancia de otra entidad. Para definir una asociación uno a uno en Hibernate, se utiliza la anotación @OneToOne.

@Entity
public class Usuario {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "perfil_id", referencedColumnName = "id")
    private Perfil perfil;
}

@Entity
public class Perfil {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String bio;
}

En este caso, la entidad Usuario tiene una asociación uno a uno con la entidad Perfil.

Asociación uno a muchos

Una asociación uno a muchos se utiliza cuando una entidad está relacionada con múltiples instancias de otra entidad. Para definir una asociación uno a muchos en Hibernate, se utiliza la anotación @OneToMany.

@Entity
public class Autor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "autor", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Libro> libros = new ArrayList<>();
}

@Entity
public class Libro {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String titulo;

    @ManyToOne
    @JoinColumn(name = "autor_id")
    private Autor autor;
}

En este ejemplo, la entidad Autor tiene una asociación uno a muchos con la entidad Libro.

Asociación muchos a muchos

Una asociación muchos a muchos se utiliza cuando múltiples instancias de una entidad están relacionadas con múltiples instancias de otra entidad. Para definir una asociación muchos a muchos en Hibernate, se utiliza la anotación @ManyToMany.

@Entity
public class Estudiante {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @JoinTable(
        name = "estudiante_curso",
        joinColumns = @JoinColumn(name = "estudiante_id"),
        inverseJoinColumns = @JoinColumn(name = "curso_id")
    )
    private Set<Curso> cursos = new HashSet<>();
}

@Entity
public class Curso {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String nombre;

    @ManyToMany(mappedBy = "cursos")
    private Set<Estudiante> estudiantes = new HashSet<>();
}

En este caso, la entidad Estudiante tiene una asociación muchos a muchos con la entidad Curso.

Consideraciones adicionales

Al trabajar con asociaciones en Hibernate, es importante tener en cuenta aspectos como el manejo de transacciones, la configuración de fetch type (por ejemplo, LAZY o EAGER), y el uso de cascade type para definir cómo se propagan las operaciones de persistencia. Además, es fundamental prestar atención a la gestión de las claves primarias y foráneas para mantener la integridad referencial en la base de datos.

Certifícate en Hibernate con CertiDevs PLUS

Lecciones de este módulo de Hibernate

Lecciones de programación del módulo Asociaciones entre entidades del curso de Hibernate.

Ejercicios de programación en este módulo de Hibernate

Evalúa tus conocimientos en Asociaciones entre entidades con ejercicios de programación Asociaciones entre entidades de tipo Test, Puzzle, Código y Proyecto con VSCode.