Hibernate

Hibernate

Tutorial Hibernate: Asociación Many To One

Hibernate asociación many to one: implementación. Domina la implementación de asociaciones many to one en Hibernate con ejemplos detallados.

Introducción

La relación ManyToOne en Hibernate se usa para representar una relación en la que múltiples registros en una tabla están asociados con un registro único en otra tabla. Es el opuesto lógico de la relación OneToMany.

Asociación Unidireccional ManyToOne

Un caso sencillo de relación ManyToOne sería una relación entre Libro y Editorial.

Un libro tiene una editorial, pero una editorial puede haber publicado muchos libros.

Aquí, Libro tiene una asociación ManyToOne con Editorial.

Para mapear esta relación en Hibernate, es necesario modificar las clases de entidad y configurar las anotaciones adecuadas.

Entidad Editorial:

Esta entidad no necesita tener conocimiento de la relación con Libro.

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

    // getters, setters y otros métodos
}

Entidad Libro

Esta entidad tiene una referencia a Editorial, la cual se mapea con la anotación @ManyToOne.

@Entity
public class Libro {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String titulo;

    @ManyToOne
    @JoinColumn(name = "editorial_id")
    private Editorial editorial;

    // getters, setters y otros métodos
}

En la entidad Libro, el uso de @ManyToOne indica que se trata de una relación "muchos a uno" con Editorial.

La anotación @JoinColumn se utiliza para especificar la columna que actuará como clave foránea (editorial_id en este caso).

Consideraciones

  1. Carga: Por defecto, Hibernate utiliza una estrategia de carga lazy (FetchType.LAZY) para las relaciones ManyToOne. Esto significa que la entidad relacionada (Editorial en nuestro caso) no se cargará de la base de datos hasta que se acceda explícitamente a ella. Si se desea cambiar este comportamiento, se puede configurar con la propiedad fetch de la anotación @ManyToOne, por ejemplo, @ManyToOne(fetch = FetchType.EAGER).

  2. Cascade: Si se desea propagar ciertas operaciones (como salvar o eliminar) de la entidad principal a la entidad relacionada, se puede utilizar la propiedad cascade de @ManyToOne. Por ejemplo, si se quiere que al eliminar un Libro también se elimine la Editorial asociada, se usaría @ManyToOne(cascade = CascadeType.REMOVE).

Asociación Bidireccional ManyToOne y OneToMany en Hibernate

Una asociación bidireccional permite navegar y manipular la relación desde ambas entidades. Si se toma el ejemplo anterior de Libro y Editorial, en una asociación bidireccional, no solo un Libro sabrá qué Editorial lo publicó, sino que una Editorial también sabrá qué libros ha publicado.

Entidad Editorial:

En esta entidad, se mantiene una lista de libros asociados. Se utiliza la anotación @OneToMany para representar esta relación.

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

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

    // getters, setters y otros métodos
}

La propiedad mappedBy indica el campo en la entidad Libro que mantiene la relación. Esta propiedad es esencial para indicar que se trata de una relación bidireccional. Además, se han añadido algunas otras propiedades opcionales como cascade y orphanRemoval para manejar cómo se deben propagar las operaciones y cómo manejar los registros huérfanos.

Entidad Libro:

La entidad Libro permanece prácticamente igual que en el ejemplo anterior de la asociación unidireccional.

@Entity
public class Libro {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String titulo;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "editorial_id")
    private Editorial editorial;

    // getters, setters y otros métodos
}

Consideraciones en Asociaciones Bidireccionales

  1. Manejo de la relación: Cuando se actualiza la relación (por ejemplo, al agregar un nuevo libro a una editorial), es necesario actualizar ambos lados de la relación para mantener la coherencia del modelo en memoria:
public void addLibro(Libro libro) {
    libros.add(libro);
    libro.setEditorial(this);
}

public void removeLibro(Libro libro) {
    libros.remove(libro);
    libro.setEditorial(null);
}

Estos métodos deben ser usados para añadir o remover libros de una Editorial y asegurarse de que ambos lados de la relación se actualicen correctamente.

  1. Consultas: Con una relación bidireccional, es posible escribir consultas JPQL o Criteria API que naveguen por ambos lados de la relación.

  2. Rendimiento: Es crucial tener cuidado al acceder al lado "muchos" de una relación bidireccional, especialmente si hay muchos registros involucrados y la relación no está configurada con carga lazy.

Certifícate en Hibernate con CertiDevs PLUS

Ejercicios de esta lección Asociación Many To One

Evalúa tus conocimientos de esta lección Asociación Many To One con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Consultas JPQL avanzadas

Hibernate
Código

Configuración con JPA

Hibernate
Test

Tipos de datos personalizados

Hibernate
Puzzle

Consultas Criteria avanzadas

Hibernate
Código

Operaciones en cascada

Hibernate
Test

Anotaciones JPA

Hibernate
Puzzle

Asociación Many To One

Hibernate
Test

Funciones en consultas JPQL

Hibernate
Código

Asociación Many To Many entre Actor y Pelicula

Hibernate
Código

Asociación One To Many entre Curso y Estudiante

Hibernate
Código

Tipos de datos básicos

Hibernate
Test

Consultas Criteria básicas

Hibernate
Código

Asociación Many To Many

Hibernate
Puzzle

CRUD de entidades con asociaciones

Hibernate
Proyecto

Optimización de asociaciones con carga lazy

Hibernate
Código

Asociación One To Many

Hibernate
Puzzle

Configuración con Maven

Hibernate
Test

Asociación One To One

Hibernate
Test

CRUD en Hibernate

Hibernate
Código

Operaciones en cascada

Hibernate
Puzzle

Introducción a Hibernate

Hibernate
Test

Atributos de tipo enum en entidades JPA

Hibernate
Código

Carga de asociaciones en consultas con EntityGraph

Hibernate
Código

Configuración con Gradle

Hibernate
Test

Asociación One To One entre Libro y Resumen

Hibernate
Código

Asociación One To Many

Hibernate
Test

Asociación Many To Many

Hibernate
Test

Creación de entidades

Hibernate
Test

Ciclo de vida de una entidad

Hibernate
Código

Consultas JPQL básicas

Hibernate
Código

Carga de asociaciones en consultas con EntityGraph y anotaciones

Hibernate
Código

Tipos de datos embebidos

Hibernate
Código

Asociación Many To One entre Paciente y Clinica

Hibernate
Código

Asociación Many To One

Hibernate
Puzzle

Optimización de consultas con DTOs

Hibernate
Código

Atributos @Transient en entidades

Hibernate
Código

Asociación One To One

Hibernate
Puzzle

Todas las lecciones de Hibernate

Accede a todas las lecciones de Hibernate y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Hibernate

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Gradle

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Maven

Hibernate

Introducción Y Entorno

Configuración Hibernate Con Jpa

Hibernate

Introducción Y Entorno

Creación De Entidades Jpa

Hibernate

Entidades Jpa Y Tipos De Datos

Tipos De Datos En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Atributos @Transient En Entidades

Hibernate

Entidades Jpa Y Tipos De Datos

Enums En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Tipos De Datos Embebidos

Hibernate

Entidades Jpa Y Tipos De Datos

Crud En Hibernate

Hibernate

Entidades Jpa Y Tipos De Datos

Ciclo De Vida De Una Entidad

Hibernate

Entidades Jpa Y Tipos De Datos

Asociación One To One

Hibernate

Asociaciones Entre Entidades

Asociación One To Many

Hibernate

Asociaciones Entre Entidades

Asociación Many To One

Hibernate

Asociaciones Entre Entidades

Asociación Many To Many

Hibernate

Asociaciones Entre Entidades

Operaciones En Cascada

Hibernate

Asociaciones Entre Entidades

Consultas Jpql Básicas

Hibernate

Consultas Hql Y Jpql

Consultas Jpql Avanzadas

Hibernate

Consultas Hql Y Jpql

Funciones En Consultas Jpql

Hibernate

Consultas Hql Y Jpql

Consultas Criteria Básicas

Hibernate

Api Criteria De Jpa

Consultas Criteria Avanzadas

Hibernate

Api Criteria De Jpa

Carga De Asociaciones En Consultas Con Entitygraph

Hibernate

Api Entitygraph

Carga De Asociaciones En Consultas Con Entitygraph Y Anotaciones

Hibernate

Api Entitygraph

Optimización De Consultas Con Dtos

Hibernate

Optimización

Optimización De Asociaciones Con Carga Lazy

Hibernate

Optimización

Certificados de superación de Hibernate

Supera todos los ejercicios de programación del curso de Hibernate y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  1. Comprender la relación ManyToOne en Hibernate y su opuesto lógico, la relación OneToMany.
  2. Aprender a mapear una relación ManyToOne de manera unidireccional utilizando las anotaciones @ManyToOne y @JoinColumn.
  3. Aprender a manejar asociaciones bidireccionales ManyToOne y OneToMany utilizando las anotaciones @OneToMany(mappedBy = "...").
  4. Reconocer la importancia de mantener la coherencia en ambas direcciones de una relación bidireccional y cómo actualizar ambos lados correctamente.
  5. Ser consciente de las consideraciones de rendimiento y carga cuando se trabaja con relaciones ManyToOne y OneToMany, especialmente en contextos bidireccionales.