Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

PROBLEMA CON EL DESAFIO

Hola. Estoy teniendo muchos problemas con el desafío. Paso mi código completo si alguien me puede apoyar. Concretamente, son dos problemas: 1) Me arma mal las tablas en posgres, porque no pone los autores en la tabla libro. 2) No me convierte bien el json porque no sé como colocar una lista de idiomas en la tabla Libro, de forma que se me genera una inconsistencia, lo que, entiendo, me da este ultimo fallo, ya que antes no lo hacia. Muchas gracias, Francisco.. CLASE PRINCIPAL public class Principal { private ConsumoAPI consumo = new ConsumoAPI();

private Conversor conversor = new Conversor();

private Scanner teclado = new Scanner(System.in);

private final String URL_BASE = "https://gutendex.com/books/";


public void MuestraElMenu() {
    var opcion = -1;
    while (opcion != 0) {
        var menu = """
                1. Buscar libros por título
                2. Listar libros registrados
                3. Listar autores registrados
                4. Listar autores vivos en un año
                5. Listar libros por idioma
                """;
        System.out.println(menu);
        opcion = teclado.nextInt();
        teclado.nextLine();

        switch (opcion) {
            case 1:
                mostrarDatosLibro();
                break;
            case 2:
                //MostrarLibros();
                break;
        }
    }

}


private void mostrarDatosLibro() {
    System.out.println("Ingrese el libro que desea buscar");
    var NombreLibro = teclado.nextLine();
    try {
        var json = consumo.obtenerDatos(URL_BASE + "?search=" + NombreLibro.replace(" ", "+"));
        Datos datosBusqueda = conversor.convierteDatos(json, Datos.class);

        List<Libro> listaLibros = new ArrayList<>();
        for (DatosLibro datosLibro : datosBusqueda.libros()) {
            Libro libro = new Libro(datosLibro);
            listaLibros.add(libro);

        }
        System.out.println(listaLibros.getFirst().toString());


    } catch (Exception e) {
        System.out.println("Error al convertir los libros");
    }







}

} CLASE LIBRO public class Libro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long Id; @Column(unique = true) private String titulo;

@OneToMany(mappedBy = "libros", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Autor> autores;

private String idiomas;

private Double numeroDeDescargas;

public Libro(DatosLibro datosLibro) {
    this.titulo = datosLibro.titulo();
    this.autores = datosLibro.autor();
    this.numeroDeDescargas = datosLibro.numeroDeDescargas();
    this.idiomas = datosLibro.idiomas();

}

public Libro() {

}

public Long getId() {
    return Id;
}

public void setId(Long id) {
    Id = id;
}
public String toString() {
    String nombreAutor = autores.get(0).getNombre();
    System.out.println("********LIBRO******************");

    return  "Titulo: " + titulo + "\n" +
            "Autor/es: " + nombreAutor + "\n" +
            "Idioma: " + idiomas + "\n" +
            "Número de descargas: " + numeroDeDescargas;
}

} CLASE AUTOR @Entity @Table(name = "autores") public class Autor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long Id;

private String nombre;

private int añoNacimiento;

private int añoMuerte;

@ManyToOne
private Libro libros;

public Autor(DatosAutor datosAutor, Libro libros) {
    this.nombre = datosAutor.nombre();
    this.añoNacimiento = datosAutor.añoNacimiento();
    this.añoMuerte = datosAutor.añoMuerte();
    this.libros = libros;

}

public Autor() {

}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public int getAñoNacimiento() {
    return añoNacimiento;
}

public void setAñoNacimiento(int añoNacimiento) {
    this.añoNacimiento = añoNacimiento;
}

public int getAñoMuerte() {
    return añoMuerte;
}

public void setAñoMuerte(int añoMuerte) {
    this.añoMuerte = añoMuerte;
}

public Libro getLibros() {
    return libros;
}

public void setLibro(Libro libros) {
    this.libros = libros;
}

}

} CLASE LIBRO

2 respuestas

¡Hola Juan!

Entiendo que estás teniendo problemas con tu desafío, específicamente con la generación incorrecta de tablas en PostgreSQL y la conversión incorrecta de JSON debido a la lista de idiomas en la tabla Libro. Parece que el problema principal está en la forma en que estás manejando las relaciones entre las entidades Libro y Autor.

En la clase Libro, estás utilizando la anotación @OneToMany para mapear la relación con Autor, pero en la clase Autor estás utilizando la anotación @ManyToOne para mapear la relación con Libro. Esto puede estar causando inconsistencias en la generación de tablas y en la conversión de JSON.

Para corregir esto, te recomendaría revisar tus anotaciones de mapeo en las clases Libro y Autor para asegurarte de que estén reflejando correctamente la relación entre estas entidades. Por ejemplo, en la clase Libro, podrías tener algo así:

@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
    name = "libro_autor",
    joinColumns = { @JoinColumn(name = "libro_id") },
    inverseJoinColumns = { @JoinColumn(name = "autor_id") }
)
private List<Autor> autores;

Y en la clase Autor, podrías tener algo así:

@ManyToMany(mappedBy = "autores")
private List<Libro> libros;

Esto establecerá una relación muchos a muchos entre Libro y Autor, lo que debería solucionar tus problemas con la generación de tablas en PostgreSQL y la conversión de JSON.

Espero que esta sugerencia te sea de ayuda. Si necesitas más asistencia, no dudes en preguntar.

¡Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios!

Hola Luis. Los problemas no ceden. Al contrario. Decidi para no complicarme la vida armar una relación de uno a muchos de autor a libros (1 autor, muchos libros) y many to one a autor (muchos libros un autor). Pero cuando quiero armar la clase-tabla Libro me topo con enormes problemas en mi constructor de la clase LIBRO. Espero puedas ayudarme, porque estoy realmente frustrado....

package aluracom.example.desafio.model;

import jakarta.persistence.*;

import java.util.ArrayList; import java.util.Collections; import java.util.List;

@Entity @Table(name = "libros")

public class Libro { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long Id; @Column(unique = true) private String titulo;

@ManyToOne
private Autor autor;

private String idiomas;

private Double numeroDeDescargas;

public Libro(DatosLibro datosLibro) {
    DatosAutor datosAutor = datosLibro.autores().get(0);
    this.titulo = datosLibro.titulo();

    this.autor = new Autor(datosAutor);

    this.numeroDeDescargas = datosLibro.numeroDeDescargas();

    this.idiomas = datosLibro.idiomas().get(0).trim();
}


public Libro() {

}

public Long getId() {
    return Id;
}

public void setId(Long id) {
    Id = id;
}

public String getTitulo() {
    return titulo;
}

public void setTitulo(String titulo) {
    this.titulo = titulo;
}

public Autor getAutor() {
    return autor;
}

public void setAutor(Autor autor) {
    this.autor = autor;

}


public String getIdiomas() {
    return idiomas;
}

public void setIdiomas(String idiomas) {
    this.idiomas = idiomas;
}

public Double getNumeroDeDescargas() {
    return numeroDeDescargas;
}

public void setNumeroDeDescargas(Double numeroDeDescargas) {
    this.numeroDeDescargas = numeroDeDescargas;
}

public String toString() {

    System.out.println("********LIBRO******************");

    return  "Titulo: " + titulo + "\n" +
            "Autor/es: " + autor + "\n" +
            "Idioma: " + "[" + idiomas + "]" + "\n" +
            "Número de descargas: " +  + numeroDeDescargas;
}

}