Solucionado (ver solução)
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.