Hibernate

Hibernate

Tutorial Hibernate: Asociación One To Many

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

Introducción

La asociación OneToMany en Hibernate es uno de los conceptos fundamentales en la persistencia orientada a objetos cuando se mapea una relación de uno a muchos entre dos entidades. Una relación OneToMany entre dos entidades implica que una instancia de la entidad A puede tener múltiples instancias de la entidad B asociadas a ella, pero una instancia de la entidad B solo puede estar asociada a una instancia de la entidad A. Un ejemplo clásico de esto es una relación entre Usuario y Telefono. Un usuario puede tener varios números de teléfono, pero un número de teléfono pertenece a un solo usuario.

Anotaciones

Para mapear la relación OneToMany en Hibernate de forma unidireccional, se utiliza la anotación @OneToMany.

Entidad Usuario

import jakarta.persistence.*;

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

    private String nombre;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "usuario_id")  // Esto especifica la columna de clave foránea en la entidad 'Telefono'
    private List<Telefono> telefonos = new ArrayList<>();

    // getters, setters y otros métodos ...
}

En este código:

  1. Se define una lista de Telefono y se anota con @OneToMany. Dado que no hay una relación inversa @ManyToOne, es necesario especificar la columna de clave foránea usando @JoinColumn.

Operación en cascada

cascade = CascadeType.ALL: Especifica que las operaciones de persistencia (como persistir, actualizar, eliminar) que se realicen en Usuario se cascaden a las entidades Telefono asociadas.

Borrar entidades huérfanas

orphanRemoval = true: Indica que cuando se elimina un Telefono de la colección de telefonos en Usuario, dicho Telefono debe ser eliminado de la base de datos.

En resumen, permiten propagar operaciones de la entidad principal a las entidades relacionadas y eliminar entidades huérfanas de la base de datos, respectivamente.

Ejemplo de uso

Para agregar un nuevo teléfono a un usuario:

Usuario usuario = new Usuario();
usuario.setNombre("Juan");

Telefono telefono = new Telefono();
telefono.setNumero("123-456-789");

usuario.getTelefonos().add(telefono);

session.save(usuario);  // Esto guardará tanto el usuario como el teléfono gracias a la cascada.

Tipo de carga

En el contexto de asociaciones @OneToMany en Hibernate:

FetchType.LAZY (Carga perezosa):

  • Es el tipo de carga por defecto para asociaciones @OneToMany.
  • Las entidades relacionadas no se cargan inmediatamente cuando se carga la entidad principal. En su lugar, se cargan cuando se accede a ellas por primera vez.
  • Ayuda a mejorar el rendimiento al no cargar innecesariamente todas las relaciones.

FetchType.EAGER (Carga temprana):

  • Las entidades relacionadas se cargan inmediatamente junto con la entidad principal.
  • Puede afectar negativamente el rendimiento si no se maneja adecuadamente, ya que puede llevar a la carga de una gran cantidad de datos no deseados.

El tipo de carga (fetch type) puede afectar significativamente el rendimiento y debe seleccionarse cuidadosamente según las necesidades de la aplicación.

Consideraciones

Unidireccionalidad: A diferencia del mapeo bidireccional, en una relación unidireccional @OneToMany no es posible navegar desde Telefono a Usuario directamente a menos que se introduzca otro mapeo o consulta.

Rendimiento: El uso de relaciones OneToMany puede tener un impacto en el rendimiento, especialmente si no se manejan correctamente. Por ejemplo, el uso excesivo de la carga eager (EAGER) puede llevar a problemas como el efecto N+1. Si bien una relación unidireccional puede parecer más simple, aún es necesario tener cuidado con las consideraciones de rendimiento, especialmente con respecto a la carga de datos.

Orden y Duplicados: Las relaciones OneToMany pueden usar colecciones de tipo List o Set. Las listas mantienen el orden y permiten duplicados, mientras que los sets no mantienen el orden y no permiten duplicados.

En conclusión, la anotación @OneToMany en Hibernate facilita la representación de relaciones unidireccionales de "uno a muchos". Aunque es más sencilla que la relación bidireccional, es esencial comprender sus implicaciones para garantizar una correcta persistencia y rendimiento.

Certifícate en Hibernate con CertiDevs PLUS

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

Evalúa tus conocimientos de esta lección Asociación One To Many 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. Entender el concepto de la asociación OneToMany en Hibernate y cómo representa relaciones "uno a muchos".
  2. Aprender a configurar esta asociación mediante la anotación @OneToMany y @JoinColumn para la clave foránea.
  3. Comprender el uso de las anotaciones cascade y orphanRemoval para administrar operaciones de persistencia y eliminación.
  4. Distinguir entre los tipos de carga (EAGER y LAZY) y cómo afectan el rendimiento de la consulta.
  5. Reconocer que las relaciones OneToMany pueden ser unidireccionales, lo que implica la necesidad de acceder a través de consultas si se requiere navegación desde el lado relacionado.