Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
14
respostas

Inserir dados em table associativa

Estou com o seguinte problema: Como vou persistir em uma tabela associativa que não possui classe ?

Possuo duas classes: Pessoa e Time, onde desejo fazer o relacionamento entre pessoas e times. Nisso e criado a tabela Pessoa_Time, com o ID de pessoa e ID de Time.

Objetivo: Meu método CadastrarPessoaTime deve incluir nessa tabela Pessoa_Time o ID da pessoa e o ID do Time.

Pessoa:

@Entity
public class Pessoa implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column (name="id_Pessoa")
    private Integer id;

    @Column()
   private String nomeUsuario;

    @Column()
    private String senhaUsuario;

    @Column()
    private String nomeCompleto;

    @Column()
    private String email;

    @Column()
    private Integer idade;

    @ManyToMany
     @JoinTable(name="Pessoa_Time",joinColumns={@JoinColumn(name="id_pessoa")}, 
     inverseJoinColumns={@JoinColumn(name="id_time")})
    private List<Time> listaTimes; 

    public Pessoa (){}

    public Pessoa (Pessoa pessoa){
        this.id = pessoa.getId();
        this.nomeUsuario = pessoa.getNomeUsuario();
        this.senhaUsuario = pessoa.getSenhaUsuario();
        this.nomeCompleto = pessoa.getNomeCompleto();
        this.email = pessoa.getEmail();
        this.idade = pessoa.getIdade();
    }



    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNomeUsuario() {
        return nomeUsuario;
    }

    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }

    public String getNomeCompleto() {
        return nomeCompleto;
    }

    public void setNomeCompleto(String nomeCompleto) {
        this.nomeCompleto = nomeCompleto;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }


    public String getSenhaUsuario() {
        return senhaUsuario;
    }

    public void setSenhaUsuario(String senhaUsuario) {
        this.senhaUsuario = senhaUsuario;
    }

    public List<Time> getListaTimes() {
        return listaTimes;
    }

    public void setListaTimes(List<Time> listaTimes) {
        this.listaTimes = listaTimes;
    }
}

Time:

@Entity
public class Time implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column (name="id_Time")
    private int id;

    @Column(nullable=false)
    private String nome;

    @Column(nullable=false)
    private String senhaTime;

    @ManyToMany(mappedBy="listaTimes")
    private List<Pessoa> listaPessoas;

    @ManyToMany(mappedBy="listaTimes")
    private List<Campeonato> listaCampeonatos;

    public Time(){}

    public Time(Time time){
        this.id = time.getId();
        this.nome = time.getNome();
        this.senhaTime = time.getSenhaTime();
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }


    public List<Pessoa> getListaPessoas() {
        return listaPessoas;
    }

    public void setListaPessoas(List<Pessoa> listaPessoas) {
        this.listaPessoas = listaPessoas;
    }

    public String getSenhaTime() {
        return senhaTime;
    }

    public void setSenhaTime(String senhaTime) {
        this.senhaTime = senhaTime;
    }



    public List<Campeonato> getListaCampeonatos() {
        return listaCampeonatos;
    }

    public void setListaCampeonatos(List<Campeonato> listaCampeonatos) {
        this.listaCampeonatos = listaCampeonatos;
    }

    @Override
    public String toString() {
        return "Time [id=" + id + ", nome=" + nome + ", senhaTime=" + senhaTime + ", listaPessoas=" + listaPessoas
                + ", listaCampeonatos=" + listaCampeonatos + "]";
    }
}

Casso necessário, posto estar disponibilizando as classes de DAO dessas duas ou o projeto no GIT completo.

14 respostas

Oi Rafael, tudo bem?

Não sei se entendi muito bem, mas se você tem uma List que é @ManyToMany basta que você insira um Time nela.

Abraços!

Leonardo, eu estou cadastrando um time mas ela so aparece na tabela de Time. Ela não se cadastra na tabela Pessoa_Time.

Meu objetivo e que um usuário cadastrando um time, apareça na tabela de Pessoa_Time o ID da pessoa que criou e o ID do Time que foi criado.

Rafael,

Pode postar seu código?

Abraços!

Projeto Git: https://github.com/stefanini485/SGT

Vou publicar as classes separadamaente

PessoaDAO:

public class PessoaDAO {

    private EntityManager em;


    public PessoaDAO() {
        setEm(JPAUtil.getEntityManager());
    }

    public void cadastrar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().persist(pessoa);
        getEm().getTransaction().commit();
    }

    public void atualizar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().merge(pessoa);
        getEm().getTransaction().commit();
    }

    public List<Pessoa> listaTodasPessoas(){
        Query q = em.createQuery("select p from Pessoa p");        
        List<Pessoa> pessoas = q.getResultList();
        return pessoas;
    }

    // Metodo que vai verificar se os dados informados pelo usuario são validos

    public boolean existe(Pessoa pessoa) {

        // Realizar uma consulta com os parametros informados pelo usuario

        String consulta = "select u from Pessoa u where u.nomeUsuario = :pUsuario and u.senhaUsuario = :pSenha";
        Query query=getEm().createQuery(consulta);

        query.setParameter("pUsuario", pessoa.getNomeUsuario());
        query.setParameter("pSenha", pessoa.getSenhaUsuario());

        // Se for verdadeiro, resultado recebe a pessoa

        try {
            Pessoa resultado = (Pessoa) query.getSingleResult();
        } catch (NoResultException ex) {
            return false;
        }

        em.close();

        return true;
    }

    public void removerPessoa(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().find(Pessoa.class, pessoa.getId());
        getEm().remove(pessoa);
        getEm().getTransaction().commit();    
    }


    public EntityManager getEm() {
        return em;
    }
    public void setEm(EntityManager em) {
        this.em = em;
    }

}

TimeDAO:

package br.com.arena.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.arena.model.Time;
import br.com.arena.util.JPAUtil;

public class TimeDAO {

    private EntityManager em;


    public TimeDAO() {
        setEm(JPAUtil.getEntityManager());
    }

    public void cadastrar(Time time){
        getEm().getTransaction().begin();
        getEm().persist(time);
        getEm().getTransaction().commit();
    }

    public List<Time> listaTodosTimes(){
        Query q = em.createQuery("select t from Time t");        
        List<Time> times = q.getResultList();
        return times;
    }

    public void atualizar(Time time){
        getEm().getTransaction().begin();
        getEm().merge(time);
        getEm().getTransaction().commit();
    }

    public void remover(Time time){
        getEm().getTransaction().begin();
        getEm().find(Time.class, time.getId());
        getEm().persist(time);
        getEm().getTransaction().commit();
    }

    public EntityManager getEm() {
        return em;
    }
    public void setEm(EntityManager em) {
        this.em = em;
    }

}

Rafael,

Qual classe você faz esse cadastro?

Utilizo JSF:

CadastrarTime.xhtml:

Criar Time - Crie seu time

TimeBean:

package br.com.arena.controller;

import java.io.Serializable;

import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean;

import br.com.arena.dao.TimeDAO; import br.com.arena.model.Time;

@ManagedBean(name = "TimeMB") @SessionScoped public class TimeBean implements Serializable{

/* */ private static final long serialVersionUID = 1L; private Time time = new Time(); private TimeDAO dao = new TimeDAO();

public TimeBean(){}

public void cadastrar() { getDao().cadastrar(getTime());

}

public Time getTime() { return time; }

public void setTime(Time time) { this.time = time; }

public TimeDAO getDao() { return dao; }

public void setDao(TimeDAO dao) { this.dao = dao; }

}

CadastrarTime.xhtml:

Criar Time - Crie seu time

Estou com problemas para enviar o codigo do arquivo xhtml.

CadastrarTime.xhtml: http://pastebin.com/SPzcFkK3

Sua classe Time tem uma List<Pessoa>. Você pode adicionar um elemento nela antes de cadastrar:

@ManyToMany(mappedBy="listaTimes")
private List<Pessoa> listaPessoas;

Abraços!

Pode me dar um exemplo ?

De uma classe que persista uma Pessoa e um Time, utilizando essa lista.

solução!

Algo assim, já que o relacionamento é bidirecional:

public void cadastrar() {
    time.getListPessoas().add(pessoa); 
    pessoa.getTimes().add(time);

    getDao().cadastrar(time);
}

Esse código seria o novo método cadastrar de time ? Ou de uma classe pra testar a criação de um time ?

Porque a estrutura não segue a mesma do TimeDAO.