1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

JPA persistir ManyToMany com Classe Associativa ?

Salve galera

Estou tentando persistir um relacionamento @ManyToMany com uma Entidade Associativa e o que acontece eh que quando persisto o valor eh sempre atualizado no banco, e eu quero adicionar novos valores.

quero que fique assim.

id_aluno | id_graduacao |    grau    | datagraduou | 
   1               1       primeiro     2014-08-02
   1               1       segundo      2014-08-02
   1               1       terceiro     2014-08-02

para isso, criei as seguintes entidades

@Entity
@Table(name="aluno")
public class Aluno implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private Integer id;

    //informacoes gerais
    @NotNull
    private String nome;

    //historico de graduacao
    @OneToMany(mappedBy = "aluno")
    private List<HistoricoDeGraduacao> listaHistoricoGraduacao;

    public Aluno(){}

    /** adiciona lista de HistoricoDeGraduacao para aluno */
    public void addListaHistoricoGraduacao(HistoricoDeGraduacao hdg){
        if(listaHistoricoGraduacao == null){
            listaHistoricoGraduacao = new ArrayList<HistoricoDeGraduacao>();
        }
        listaHistoricoGraduacao.add(hdg);        
    }

    public List<HistoricoDeGraduacao> getListaHistoricoGraduacao() {
        return listaHistoricoGraduacao;
    }
    ///gets e sets

@Entity
@Table(name="graduacao")
public class Graduacao implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private Integer id;

    @NotNull @Column(unique = true)
    private String graduacao;

    @ElementCollection
    @CollectionTable(name="graus_graduacao", joinColumns=@JoinColumn(name="id_graduacao"))
    @Column(name="graus")
    private List<String> graus;

    @OneToMany(mappedBy = "graduacao")
    private List<HistoricoDeGraduacao> listaHistoricoGraduacao;

    public Graduacao() {
    }

    /** adiciona historicodegraduacao a graduacao */
    public void addHistoricoDeGraduacao(HistoricoDeGraduacao hdg){
        if(listaHistoricoGraduacao == null){
            listaHistoricoGraduacao = new ArrayList<HistoricoDeGraduacao>();
        }
        listaHistoricoGraduacao.add(hdg);
    }

    public List<HistoricoDeGraduacao> getListaHistoricoGraduacao() {
        return listaHistoricoGraduacao;
    }
    //gets e sets



public class HistoricoDeGraduacaoId implements Serializable {
    private static final long serialVersionUID = 1L;

    private Aluno aluno;    
    private Graduacao graduacao;

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public Graduacao getGraduacao() {
        return graduacao;
    }

    public void setGraduacao(Graduacao graduacao) {
        this.graduacao = graduacao;
    }


@Entity
@IdClass(HistoricoDeGraduacaoId.class)
public class HistoricoDeGraduacao implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @ManyToOne 
    @JoinColumn(name = "id_aluno")
    private Aluno aluno;

    @Id
    @ManyToOne
    @JoinColumn(name="id_graduacao")
    private Graduacao graduacao;

    private String grau;

    @Temporal(TemporalType.DATE)
    private Date dataGraduou;

    public HistoricoDeGraduacao() {
    }
    //gets e sets


//DAO de persistencia
    /** executa update */
    public void update(){        
        em.getTransaction().begin();

        Aluno a = new Aluno(); 
        a.setId(1);//aluno ja possui Id

        Graduacao g = new Graduacao();
        g.setId(1); //graduacao ja possui Id

        HistoricoDeGraduacao hdg = new HistoricoDeGraduacao();
        hdg.setAluno(a);
        hdg.setGraduacao(g);
        hdg.setDataGraduou(new Date());
        hdg.setGrau("PRIMEIRO");
        a.addHistoricoDeGraduacao(hdg);
        g.addHistoricoDeGraduacao(hdg);
        em.persist(hdg); //usando persiste nao funciona, usando merge funciona mas fica atualizando sempre o msm registro e nao adiciona novos

        em.getTransaction().commit();
        em.close();
    }

Como resolver isso ?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa persistência hibernate java entity-framework ou faça a sua própria pergunta.