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

[Dúvida] Duvida no mapeamento

Estou começando a desenvolver um sistema de avaliações de filmes e series que vai ser o trabalho desse período da faculdade. O projeto vai ter as classes de usuários, filmes, series e avaliações. A ideia é que cada usuário possa avaliar filmes e series e no front apresente na tela do filme escolhido as avaliações que todos usuários fizerem sobre o filme ou serie. Vou utilizar java com Servlet e JPA para a conexão com o banco. A minha duvida é como vou criar o método de salvar uma avaliação que o usuário fez sobre determinado filme no banco. Vou deixar o código do que já fiz, se alguém tiver alguma dica de como eu posso fazer, me conta por favor!

Usuario:

package br.com.review.model.entities;

import java.time.LocalDate;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "usuarios")
public class Usuario {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "usuario_id")
    private Long id;
    @Column(name = "nome")
    private String nome;
    @Column(name = "sobrenome")
    private String sobrenome;
    @Column(name = "email")
    private String email;
    @Column(name = "senha")
    private String senha;
    @Column(name = "data_nascimento")
    private LocalDate dataDeNascimento;
    @Column(name = "genero")
    private String genero;
    
    @OneToMany(mappedBy = "usuario")
    private List<Avaliacoes> listAvaliacoes;

    public Usuario(String nome, String sobrenome, String email, String senha, LocalDate dataDeNascimento,
            String genero) {
        
        this.nome = nome;
        this.sobrenome = sobrenome;
        this.email = email;
        this.senha = senha;
        this.dataDeNascimento = dataDeNascimento;
        this.genero = genero;
    }
    
    public Usuario() {}


    public Long getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public String getEmail() {
        return email;
    }

    public String getSenha() {
        return senha;
    }

    public LocalDate getDataDeNascimento() {
        return dataDeNascimento;
    }

    public String getGenero() {
        return genero;
    }
    
    public List<Avaliacoes> getListAvaliacoes() {
        return listAvaliacoes;
    }
    
    public List<Avaliacoes> setListAvaliacoes(List<Avaliacoes> listAvaliacoes) {
        return listAvaliacoes = listAvaliacoes;
    }

    @Override
    public String toString() {
        return "Usuario [id=" + id + ", nome=" + nome + ", sobrenome=" + sobrenome + ", email=" + email + ", senha="
                + senha + ", dataDeNascimento=" + dataDeNascimento + ", genero=" + genero + "]";
    }
    
}
7 respostas

Filmes:

package br.com.review.model.entities;

import java.time.LocalDate;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "filmes")
public class Filmes implements Item{
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "filmes_id")
    private Long id;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "descricao")
    private String descricao;
    @Column(name = "duracao")
    private Double duracao;
    @Column(name = "diretor")
    private String diretor;
    @Column(name = "data_lancamento")
    private LocalDate dataDeLancamento;
    @Column(name = "genero")
    private String genero;
    @Column(name = "url_img")
    private String urlImg;
    @Column(name = "url_trailer")
    private String urlTrailer;
    
    @OneToMany(mappedBy = "filmes")
    private List<Avaliacoes> listAvaliacoes;
    
    public Filmes(String titulo, String descricao, Double duracao, String diretor, LocalDate dataDeLancamento,
            String genero) {
        
        this.titulo = titulo;
        this.descricao = descricao;
        this.duracao = duracao;
        this.diretor = diretor;
        this.dataDeLancamento = dataDeLancamento;
        this.genero = genero;
    }

    public Filmes() {}

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public String getTitulo() {
        return titulo;
    }

    @Override
    public String getDescricao() {
        return descricao;
    }

    @Override
    public Double getDuracao() {
        return duracao;
    }

    @Override
    public Integer getTemporadas() {
        return null;
    }

    @Override
    public String getdiretor() {
        return diretor;
    }

    @Override
    public LocalDate getDataDeLancamento() {
        return dataDeLancamento;
    }

    @Override
    public String getGenero() {
        return genero;
    }
    
    @Override
    public String getUrlImg() {
        return urlImg;
    }

    @Override
    public String getUrlTrailer() {
        return urlTrailer;
    }
    
    @Override
    public List<Avaliacoes> getListAvaliacoes() {
        return listAvaliacoes;
    }
    
    @Override
    public List<Avaliacoes> setListAvaliacoes(List<Avaliacoes> listAvaliacoes) {
        return this.listAvaliacoes = listAvaliacoes;
    }

    @Override
    public String toString() {
        return "Filmes [id=" + id + ", titulo=" + titulo + ", descricao=" + descricao + ", duracao=" + duracao
                + ", diretor=" + diretor + ", dataDeLacamento=" + dataDeLancamento + ", genero=" + genero + "]";
    }	
}

Series:

package br.com.review.model.entities;

import java.time.LocalDate;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "series")
public class Series implements Item{
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "series_id")
    private Long id;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "descricao")
    private String descricao;
    @Column(name = "temporadas")
    private Integer temporadas;
    @Column(name = "diretor")
    private String diretor;
    @Column(name = "data_lancamento")
    private LocalDate dataDeLancamento;
    private String genero;
    @Column(name = "url_img")
    private String urlImg;
    @Column(name = "url_trailer")
    private String urlTrailer;
    
    @OneToMany(mappedBy = "series")
    private List<Avaliacoes> listAvaliacoes;
    
    public Series(String titulo, String descricao, Integer temporadas, String diretor, LocalDate dataDeLancamento,
            String genero) {
        
        this.titulo = titulo;
        this.descricao = descricao;
        this.temporadas = temporadas;
        this.diretor = diretor;
        this.dataDeLancamento = dataDeLancamento;
        this.genero = genero;
    }

    public Series() {}

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public String getTitulo() {
        return titulo;
    }

    @Override
    public String getDescricao() {
        return descricao;
    }

    @Override
    public Double getDuracao() {
        return null;
    }

    @Override
    public Integer getTemporadas() {
        return temporadas;
    }

    @Override
    public String getdiretor() {
        return diretor;
    }

    @Override
    public LocalDate getDataDeLancamento() {
        return dataDeLancamento;
    }

    @Override
    public String getGenero() {
        return genero;
    }
    
    @Override
    public String getUrlImg() {
        return urlImg;
    }

    @Override
    public String getUrlTrailer() {
        return urlTrailer;
    }
    
    @Override
    public List<Avaliacoes> getListAvaliacoes() {
        return listAvaliacoes;
    }
    
    @Override
    public List<Avaliacoes> setListAvaliacoes(List<Avaliacoes> listAvaliacoes) {
        return this.listAvaliacoes = listAvaliacoes;
    }
    
    @Override
    public String toString() {
        return "Series [id=" + id + ", titulo=" + titulo + ", descricao=" + descricao + ", temporadas=" + temporadas
                + ", diretor=" + diretor + ", dataDeLancamento=" + dataDeLancamento + ", genero=" + genero + "]";
    }
}

Avaliações:

package br.com.review.model.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "avaliacoes")
public class Avaliacoes {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "avaliacoes_id")
    private Long id;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "avaliacoes")
    private String avaliacao;
    @Column(name = "classificacao")
    private Integer classificacao;
    
    @ManyToOne
    @JoinColumn(name = "usuario_id")
    private Usuario usuario;
    
    private Item item;
    
    @ManyToOne
    @JoinColumn(name = "series_id")
    private Series series;
    
    @ManyToOne
    @JoinColumn(name = "filmes_id")
    private Filmes filmes;
    
    public Avaliacoes() {}

    public Long getId() {
        return id;
    }

    public String getTitulo() {
        return titulo;
    }

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

    public String getAvaliacao() {
        return avaliacao;
    }

    public void setAvaliacao(String avaliacao) {
        this.avaliacao = avaliacao;
    }

    public Integer getClassificacao() {
        return classificacao;
    }

    public void setClassificacao(Integer classificacao) {
        this.classificacao = classificacao;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }

    public Series getSeries() {
        return series;
    }

    public void setSeries(Series series) {
        this.series = series;
    }

    public Filmes getFilmes() {
        return filmes;
    }

    public void setFilmes(Filmes filmes) {
        this.filmes = filmes;
    }

    @Override
    public String toString() {
        return "Avaliacoes [id=" + id + ", titulo=" + titulo + ", avaliacao=" + avaliacao + ", classificacao="
                + classificacao + ", usuario=" + usuario + ", item=" + item + ", series=" + series + ", filmes="
                + filmes + "]";
    }
    
}

Interface Item:

package br.com.review.model.entities;

import java.time.LocalDate;
import java.util.List;

public interface Item {
    
    Long getId();
    String getTitulo();
    String getDescricao();
    Double getDuracao();
    Integer getTemporadas();
    String getdiretor();
    LocalDate getDataDeLancamento();
    String getGenero();
    String getUrlImg();
    String getUrlTrailer();
    List<Avaliacoes> getListAvaliacoes();
    List<Avaliacoes> setListAvaliacoes(List<Avaliacoes> listAvaliacoes);
}

A minha grande duvida é como salvar as avaliações que cada usuario fez para os filmes e as series

solução!

Oi!

Parece que você está desenvolvendo um sistema que envolve três entidades principais: Usuário, Filmes e Séries, e Avaliações.

Passo 1: Associação entre as Entidades

Primeiro, você já configurou a associação entre as entidades de forma adequada. Cada entidade de Filme e Série tem uma lista de Avaliações, o que é um bom começo. Além disso, a entidade de Avaliações possui referências para Filmes, Séries e Usuários. Certifique-se de que essas associações estejam configuradas corretamente nas classes.

Passo 2: Criar um Endpoint ou Método para Salvar Avaliações

Agora, você precisará criar um endpoint ou método em sua aplicação para permitir que os usuários salvem suas avaliações. No caso do Java com Servlet e JPA, você pode criar um Servlet que tratará as solicitações de avaliação e salvará as informações no banco de dados usando JPA.

Aqui está um exemplo de como você pode criar um Servlet para lidar com isso:

@WebServlet("/avaliar")
public class AvaliacaoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Recupere os parâmetros do formulário (avaliação, classificação, ID do filme/série, ID do usuário)
        String avaliacao = request.getParameter("avaliacao");
        int classificacao = Integer.parseInt(request.getParameter("classificacao"));
        long itemId = Long.parseLong(request.getParameter("itemId")); // Pode ser o ID de um filme ou série
        long userId = Long.parseLong(request.getParameter("userId"));

        // Recupere o usuário e o item (filme ou série) com base nos IDs
        Usuario usuario = usuarioService.buscarUsuarioPorId(userId);
        Item item = itemService.buscarItemPorId(itemId);

        // Crie uma nova avaliação
        Avaliacoes avaliacao = new Avaliacoes();
        avaliacao.setAvaliacao(avaliacao);
        avaliacao.setClassificacao(classificacao);
        avaliacao.setUsuario(usuario);
        avaliacao.setItem(item);

        // Salve a avaliação no banco de dados usando JPA
        avaliacaoService.salvarAvaliacao(avaliacao);

        // Redirecione o usuário de volta para a página do filme/série
        response.sendRedirect("/detalhes-item?id=" + itemId);
    }
}

Neste exemplo, você precisaria criar serviços (usuarioService, itemService e avaliacaoService) que lidariam com a recuperação de usuários e itens a partir de seus IDs e a salvaguarda das avaliações no banco de dados.

Passo 3: Interface de Usuário para Avaliações

Na interface de usuário, crie um formulário onde os usuários possam inserir suas avaliações e classificações. Por exemplo, você pode criar um formulário com campos para avaliação, classificação e um menu suspenso para selecionar se estão avaliando um filme ou uma série.

Passo 4: Processar a Avaliação

Quando o usuário enviar o formulário de avaliação, o Servlet que você criou no Passo 2 irá processar a solicitação, salvar a avaliação no banco de dados e redirecionar o usuário de volta para a página do filme/série que eles avaliaram. Isso permitirá que os usuários vejam as avaliações de outros usuários na página do filme/série.

Passo 5: Exibindo as Avaliações

Por fim, na página de detalhes do filme/série, você pode recuperar as avaliações associadas a esse item e exibi-las na tela. Você já tem a associação entre as entidades Filme/Série e Avaliações configurada, o que facilitará a recuperação das avaliações relacionadas a um item específico.

Valeu mesmo pelas dicas, deu uma clareada aqui nas ideias.