Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] estou com uma duvida no projeto

estou fazendo o desafio final porem me deparei com um problema, que ja quebrei bastante a cabeça mas nao to conseguindo passar, na hora de cadastrar uma musica, acontece que por exemplo legiao urbana -tempo perdido ai ok vou cadastrar outro cantor charlie brown exemplo musica ceu azul o ultimo cantor cadastrado duplica a musica de cima ficando charlie brown - tempo perdido e charlie brown ceu azul, e o antior cria normal não sei onde esta o erro kkk alguem me ajuda porfavor

package br.com.alura.desafioJPA.Principal;

import br.com.alura.desafioJPA.Model.Artista;
import br.com.alura.desafioJPA.Model.Genero;
import br.com.alura.desafioJPA.Model.Musica;
import br.com.alura.desafioJPA.Service.Repositorio;
import org.springframework.beans.factory.annotation.Autowired;

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

public class Principal {
    Scanner sc = new Scanner(System.in);
    Artista artista;
    List<Artista> artistalist = new ArrayList<>();
    List<Musica> musicaList = new ArrayList<>();
    Musica musica;
  Repositorio repositorio;
    Artista aristaencontrado;

    public Principal(Repositorio repositorio) {
        this.repositorio = repositorio;
    }


    public void exibeMenu(){

        var opcao = -1;

        while (opcao!=0){
            var menu = """
             ***********   Screen  Sound Musicas *******************
             1 - Cadastrar Artista
             2 - listar artistas cadastrados
             3 - Cadastrar músicas
             4 - Listar músicas
             5 - Buscar músicas por Artistas
             6 - pesquisar sobre um Artista
             0 - Finalizando aplicação
              
                
               """;
            System.out.printf(menu);
            opcao = sc.nextInt();
            sc.nextLine();
            switch (opcao){
                case 1:
                    cadastrarArtista();
                    break;
                case 2:
                    listarArtistasCadastrados();
                    break;
                case 3:
                    cadastrarMusicas();
                    break;
                case 4:
                    listarMusicasCadastradas();
                    break;
                case 0:
                    System.out.printf("Saindo....");
                    break;
            }
        }



    }

    private void cadastrarArtista() {
        System.out.println("digite o nome do artista que deseja Cadastrar: ");
        var nome = sc.nextLine();
        System.out.println("informe a idade do artista: ");
        var idade = sc.nextInt();
        sc.nextLine();
        System.out.println("informe a nacionalidade do artista: ");
        var nacionalidade = sc.nextLine();
        System.out.println("genero musical: ");
        Genero genero = Genero.fromString(sc.nextLine());
        artista = new Artista(nome,idade,nacionalidade,genero);
        artistalist.add(artista);
        repositorio.save(artista);

    }

    private void listarArtistasCadastrados() {
        artistalist = repositorio.findAll();
        artistalist.stream()
                .sorted(Comparator.comparing(Artista::getNome))
                .map(s -> s.getNome().toLowerCase())
                .forEach(System.out::println);
    }

    private void cadastrarMusicas() {
        System.out.println("Digite o nome do artiste que deseja cadastrar uma musica: ");
        var nomeCantor = sc.nextLine();

        Optional<Artista> artista1 = artistalist.stream()
                .filter(s -> s.getNome().toLowerCase().contains(nomeCantor.toLowerCase()))
                .findFirst();

        if (artista1.isPresent()){
            aristaencontrado = artista1.get();
            System.out.println("nome da musica");
            var nomeMusica = sc.nextLine();
            System.out.println("nome do album");
            var nomeAlbum = sc.nextLine();
            System.out.println("ano de lancamento");
            var anoDelancamento = sc.nextInt();
            sc.nextLine();
            musica = new Musica(nomeAlbum,nomeMusica,anoDelancamento,aristaencontrado);
            musicaList.add(musica);
            aristaencontrado.setMusicaList(musicaList);
            repositorio.save(aristaencontrado);


        }else {
            System.out.println("cantor não cadastrado em nosso banco de dados tente novamente!!");

        }


3 respostas

continuação porque nao deu pra por tudo na linha de cima

package br.com.alura.desafioJPA.Model;

import jakarta.persistence.*;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@Entity
@Table(name = "musicas")
public class Musica  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    private String nomeMusica;
    private String Album;
    private int AnoDeLancamento;
    @ManyToOne
    private Artista artista;

    public Musica(){
    }

    public Musica(String nome, String album, int anoDeLancamento, Artista artistas) {
        this.nomeMusica = nome;
        this.Album = album;
        this.AnoDeLancamento = anoDeLancamento;
        this.artista = artistas;
    }

    public String getAlbum() {
        return Album;
    }

    public void setAlbum(String album) {
        Album = album;
    }


    public Artista getArtista() {
        return artista;
    }

    public void setArtista(Artista artista) {
        this.artista = artista;
    }

    public Musica(Long id, String nome, int anoDeLancamento) {
        Id = id;
        nomeMusica = nome;
        AnoDeLancamento = anoDeLancamento;
    }

    public Long getId() {
        return Id;
    }

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

    public String getNome() {
        return nomeMusica;
    }

  //  public void setNome(String nome) {
   //     nomeMusica = nome;
  //  }

    public double getAnoDeLancamento() {
        return AnoDeLancamento;
    }

    public void setAnoDeLancamento(int anoDeLancamento) {
        AnoDeLancamento = anoDeLancamento;
    }

    @Override
    public String toString() {
        return "Musica(" +
                "album: " + this.Album +
                ", Musica'" + this.nomeMusica + '\'' +
                ", AnoDeLancamento= " + this.AnoDeLancamento +
                 " Artista: " + this.artista.getNome() + ")";
    }
}package br.com.alura.desafioJPA.Model;



import br.com.alura.desafioJPA.Service.ConsultaChatGPT;
import jakarta.persistence.*;

import java.util.List;

@Entity
@Table(name = "artistas")
public class Artista {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    private String Nome;
    private int Idade;
    private String Nacionalidade;
    @Enumerated(EnumType.STRING)
    private Genero genero;
    private String Biografia;
    @OneToMany(mappedBy = "artista",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private List<Musica> musicaList;

    public Artista(){
    }


    public Artista(String nome, int idade, String nacionalidade,Genero genero) {
        Nome = nome;
        Idade = idade;
        Nacionalidade = nacionalidade;
        this.genero = genero;
    }

//    public Artista(String nome, int idade, String nacionalidade, String biografia) {
//        this.Nome = nome;
//        this.Idade = idade;
//        this.Nacionalidade = nacionalidade;
//        this.Biografia = ConsultaChatGPT.ObterDados(biografia).trim();
//    }


    public Genero getGenero() {
        return genero;
    }

    public void setGenero(Genero genero) {
        this.genero = genero;
    }

    public String getBiografia() {
        return Biografia;
    }

    public void setBiografia(String biografia) {
        Biografia = biografia;
    }

    public List<Musica> getMusicaList() {
        return musicaList;
    }

    public void setMusicaList(List<Musica> musicaList) {
        musicaList.forEach(e -> e.setArtista(this));
        this.musicaList = musicaList;
    }
    public Long getId() {
        return Id;
    }

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

    public String getNome() {
        return Nome;
    }

    public void setNome(String nome) {
        Nome = nome;
    }

    public int getIdade() {
        return Idade;
    }

    public void setIdade(int idade) {
        Idade = idade;
    }

    public String getNacionalidade() {
        return Nacionalidade;
    }

    public void setNacionalidade(String nacionalidade) {
        Nacionalidade = nacionalidade;
    }

    @Override
    public String toString() {
        return "Artista{" +
                ", Nome='" + Nome + '\'' +
                ", Idade=" + Idade +
                '}';
    }
}
solução!

Olá Wesley.

Isso está acontecendo pois você criou uma variável global musicaList e toda vez que está adicionando uma música está acrescentando na lista, e depois na hora de salvar está usando aristaencontrado.setMusicaList(musicaList);

Por esse motivo enquanto a aplicação estiver rodando, todas as músicas que forem adicionadas na lista permanecem na lista e serão sempre incluídas para todos os artistas que você cadastrar uma nova música.

Uma forma de fazer que isso não aconteça é não usar uma lista e sim usar a própria lista do objeto artista instanciado. Ficaria

            musica = new Musica(nomeAlbum,nomeMusica,anoDelancamento,aristaencontrado);
            aristaencontrado.getMusicaList().add(musica);
            repositorio.save(aristaencontrado);

Você pode também fazer essa lista ser local dentro do método cadastrarMusica. Assim toda vez que o método for chamado ira iniciar uma nova lista e não vai manter a lista para o artista anterior. Mas acredito que fazer lista só seria vantagem caso tivesse uma repetição para adicionar várias músicas para o mesmo artista sem precisar voltar ao menu, se a cada adição o programa voltar ao menu, o melhor a fazer é como está acima mesmo.

Espero ter ajudado.

Bons estudos

deu certo muito obrigado