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

Haga lo que hicimos: relacionando series y episodios

“Episodio.java”

package com.aluracursos.screenmatch.model;

import jakarta.persistence.*;

import java.time.LocalDate;
import java.time.format.DateTimeParseException;

@Entity
@Table(name = "episodios")
public class Episodio {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
private Integer temporada;
private String titulo;
private Integer numeroEpisodio;
private Double evaluacion;
private LocalDate fechaDeLanzamiento;
@ManyToOne
private Serie serie;

public Episodio(){}
public Episodio(Integer numero, DatosEpisodio d) {
    this.temporada = numero;
    this.titulo = d.titulo();
    this.numeroEpisodio = d.numeroEpisodio();
    try{
        this.evaluacion = Double.valueOf(d.evaluacion());
    }catch (NumberFormatException e){
        this.evaluacion = 0.0;
    }
    try{
        this.fechaDeLanzamiento = LocalDate.parse(d.fechaDeLanzamiento());
    } catch (DateTimeParseException e){
        this.fechaDeLanzamiento = null;
    }

}

“Principal.java”

package com.aluracursos.screenmatch.principal;

import com.aluracursos.screenmatch.model.DatosSerie;
import com.aluracursos.screenmatch.model.DatosTemporada;
import com.aluracursos.screenmatch.model.Serie;
import com.aluracursos.screenmatch.repository.SerieRepository;
import com.aluracursos.screenmatch.service.ConsumoAPI;
import com.aluracursos.screenmatch.service.ConvierteDatos;

import java.util.*;
import java.util.stream.Collectors;

public class Principal {
private Scanner teclado = new Scanner(System.in);
private ConsumoAPI consumoApi = new ConsumoAPI();
private final String URL_BASE = "https://www.omdbapi.com/?t=";
private final String API_KEY = "&apikey=4fc7c187";
private ConvierteDatos conversor = new ConvierteDatos();
private List datosSeries = new ArrayList<>();
private List series = new ArrayList<>();

private SerieRepository repository;
public Principal(SerieRepository repository) {
    this.repository = repository;
}

public void muestraElMenu(){
    var opcion = -1;
    while (opcion != 0){
        var menu = """
          1 - Buscar series 
          2 - Buscar episodios
          3 - Listar series buscadas
          0 - Salir
          """;
        System.out.println(menu);

    opcion = teclado.nextInt();
    teclado.nextLine();

    switch (opcion) {
        case 1:
            buscarSerieWeb();
            break;
        case 2:
            buscarEpisodioPorSerie();
            break;
        case 3:
            listarSeriesBuscadas();
            break;
        case 0:
            System.out.println("Cerrando la aplicación...");
            break;
        default:
            System.out.println("Opción inválida");
        }
    }
}

private void buscarSerieWeb() {
    DatosSerie datos = getDatosSerie();
    Serie serie = new Serie(datos);
    repository.save(serie);
    //datosSeries.add(datos);
    System.out.println(datos);

}

private DatosSerie getDatosSerie() {
    System.out.println("Escribe el nombre de la serie que deseas buscar");
    var nombreSerie = teclado.nextLine();
    var json = consumoApi.obtenerDatos(URL_BASE + nombreSerie.replace(" ", "+" )+ API_KEY);
    DatosSerie datos = conversor.obtenerDatos(json, DatosSerie.class);
    System.out.println(datos.sinopsis());
    return datos;
}

private void buscarEpisodioPorSerie(){
    listarSeriesBuscadas();
    System.out.println("Escriba el nombre de la serie que desea ver");
    var nombreSerie = teclado.nextLine();
    Optional<Serie> serie = series.stream()
            .filter(s -> s.getTitulo().toLowerCase().contains(nombreSerie.toLowerCase()))
            .findFirst();
    if (serie.isPresent()){
        var serieBuscada = serie.get();
        List<DatosTemporada> temporadas = new ArrayList<>();
        for (int i = 1; i <= serieBuscada.getTotalTemporadas(); i++) {
            var json = consumoApi.obtenerDatos(URL_BASE + serieBuscada.getTitulo().replace(" ", "+") + "&season=" + i + API_KEY);
            DatosTemporada datosTemporada = conversor.obtenerDatos(json, DatosTemporada.class);
            temporadas.add(datosTemporada);
        }
        temporadas.forEach(System.out::println);
    }

}
private void listarSeriesBuscadas() {
    series = repository.findAll();
    series.stream()
            .sorted(Comparator.comparing(Serie::getGenero))
            .forEach(System.out::println);

}

}

1 respuesta

¡Hola Yolima, espero que estés bien!

Parece que estás trabajando en relacionar las entidades Serie y Episodio en tu aplicación usando Spring Data JPA. Para establecer una relación bidireccional entre estas dos entidades, necesitas hacer algunos ajustes en tu código.

  1. En la clase Serie: Debes añadir una lista de episodios para establecer la relación bidireccional. Aquí te dejo un ejemplo de cómo podrías hacerlo:
@Entity
@Table(name = "series")
public class Serie {

    // otros atributos...

    @OneToMany(mappedBy = "serie", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Episodio> episodios = new ArrayList<>();

    // métodos...

    public void addEpisodio(Episodio episodio) {
        episodios.add(episodio);
        episodio.setSerie(this);
    }

    public void removeEpisodio(Episodio episodio) {
        episodios.remove(episodio);
        episodio.setSerie(null);
    }
}
  1. En la clase Episodio: Ya tienes la anotación @ManyToOne para la relación con Serie, lo cual está correcto.

  2. Persistencia de Episodios: Cuando guardes una serie, asegúrate de que también estás guardando sus episodios. Esto se puede hacer al añadir episodios a la serie antes de llamar al método save del repositorio.

Por ejemplo, al buscar episodios de una serie, podrías hacer algo similar a esto:

private void buscarEpisodioPorSerie() {
    // ... tu código existente ...

    if (serie.isPresent()) {
        var serieBuscada = serie.get();
        List<DatosTemporada> temporadas = new ArrayList<>();
        for (int i = 1; i <= serieBuscada.getTotalTemporadas(); i++) {
            var json = consumoApi.obtenerDatos(URL_BASE + serieBuscada.getTitulo().replace(" ", "+") + "&season=" + i + API_KEY);
            DatosTemporada datosTemporada = conversor.obtenerDatos(json, DatosTemporada.class);
            temporadas.add(datosTemporada);

            // Añadir episodios a la serie
            datosTemporada.getEpisodios().forEach(datosEpisodio -> {
                Episodio episodio = new Episodio(i, datosEpisodio);
                serieBuscada.addEpisodio(episodio);
            });
        }
        repository.save(serieBuscada); // Guarda la serie junto con sus episodios
        temporadas.forEach(System.out::println);
    }
}

Espero que estos pasos te ayuden a establecer correctamente la relación entre las series y los episodios en tu aplicación. ¡Buena suerte con tu proyecto y sigue adelante!

Espero haber ayudado y buenos estudios!