Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

No se guardan los datos de autor mapeados por el libro

Buenas tardes.

Actualmente estoy trabajando en el Challenge de aluralibros. He logrado generar las conexión y poder llenar la base de datos con la información de la entidad Libro; Sin embargo, tengo una relación con Autor para que se llene la tabla autor pero al revisar solo hace un select a la tabla y no se registra ningún dato.

Esta es la relación que tengo en la entidad Autor:

@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) private Libro libro;

Y esta en la entidad Libro:

@OneToOne(mappedBy = "libro") private Autor autorEnt;

Asumí que la relación iba a ser uno a uno por eso la diseñé de esa manera. Sin embargo el resultado es este:

Hibernate: select l1_0.id,l1_0.autor,ae1_0.id,ae1_0.fecha_deceso,ae1_0.fecha_nacimiento,ae1_0.nombre,l1_0.idioma,l1_0.nombre from libros l1_0 left join autor ae1_0 on l1_0.id=ae1_0.libro_id where l1_0.id=?

La llave foranea en la BD llega como null.

Podrían ayudarme a revisar qué podría estar pasando?

Gracias!

1 respuesta

¡Hola Estudiante, espero que estés bien!

Sugerencia: creo que es mejor tener una relación @OneToMany por el lado del autor, por exemplo en tu entidad tener un atributo como:

@OneToMany(mappedBy = "autor", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Libro> libros = new ArrayList<>();

Y al lado del libro algo como:

@ManyToOne()
    private Autor autor;

Esta primera línea de código define una relación entre dos entidades en una aplicación Java, probablemente para un framework de persistencia como JPA (Java Persistence API). Analicemos los detalles:

  • @OneToMany: Esta anotación indica que existe una relación uno-a-muchos entre la clase a la que pertenece este fragmento de código (llamémosla Autor) y otra clase (Libro). Esto significa que un Autor puede tener muchos Libros.
  • mappedBy="autor": Esta parte especifica el nombre de un campo en la clase Libro que hace referencia al objeto Autor. Esto establece una relación bidireccional, permitiéndole navegar desde Autor a Libros y viceversa.
  • cascade = CascadeType.ALL: Esta opción le dice a JPA que propague cualquier operación realizada en el objeto Autor (como guardar o eliminar) a los objetos Libro asociados también.
  • fetch = FetchType.EAGER: Esto indica a JPA que recupere con avidez (eager) todos los Libros asociados con un Autor siempre que se recupere el propio Autor de la base de datos. Esto puede mejorar el rendimiento de las aplicaciones que necesitan acceder a los datos de Autor y Libro con frecuencia, pero también puede aumentar los tiempos de carga iniciales.
  • private List<Libro> libros = new ArrayList<>(): Esta línea declara una variable miembro privada llamada libros de tipo List<Libro>.Esta variable almacenará la colección de objetos Libro asociados con el Autor actual.

En resumen, este código le permite administrar una colección de libros escritos por un autor. Garantiza la consistencia de los datos al persistir o eliminar automáticamente los libros relacionados cada vez que se guarda o elimina la información del autor.

Entiendo que estás teniendo un problema con la relación entre las entidades Libro y Autor en tu aplicación Java utilizando Spring Data JPA. Parece que la relación entre Libro y Autor está configurada como uno a uno, pero los datos del autor no se están guardando correctamente en la base de datos.

Una posible causa de que la clave foránea llegue como nula en la base de datos es que la relación no se esté estableciendo correctamente al guardar los datos.

Una forma de solucionar esto es asegurarte de que al momento de guardar un libro con su respectivo autor, estés estableciendo la relación en ambas entidades. Por ejemplo, al guardar un libro con su autor, deberías hacer algo similar a esto:

Libro libro = new Libro();
Autor autor = new Autor();

// Configurar los datos del libro y del autor

libro.setAutorEnt(autor);
autor.setLibro(libro);

// Guardar el libro y el autor utilizando el repositorio de Spring Data JPA

De esta manera, al guardar el libro y el autor, se establecerá la relación entre ellos y se debería reflejar correctamente en la base de datos.

Espero que esta sugerencia te ayude a solucionar el problema. Si necesitas más ayuda, no dudes en preguntar. ¡Buena suerte con tu proyecto!

Espero haber ayudado y buenos estudios!