Dúvida cruel JPA!

2 respostas
C

Olá pessoal, minha dúvida é a seguinte. Tenha três entidades - ALUNO, GRAUS, ALUNO_GRAUS, onde a entidade ALUNO_GRAUS é uma associação entre ALUNO e GRAUS. Coloquei uma classe de chave composta @EmbeddedId, com três compos, para a classe ALUNO_GRAUS. Eis a dúvida como se persiste esta situação. Posso persistir um aluno com vários alunos_agrau ou tenho que persistir primeiro o aluno e depois a List<aluno_grau>?

@Entity
@Table(name = "ALUNOS")

public class aluno {

    @OneToMany(mappedBy = "aluno")
    private List<aluno_grau> aluno_graus;


@Entity
@Table(name = "aluno_graus")

public class aluno_grau {
       @EmbeddedId
    protected AlunoGrausPK alunoGrausPK;
    @JoinColumn(name = "ID_ALUNO", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private aluno aluno;
    @JoinColumn(name = "ID_GRAU", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private grau grau;


@Embeddable
public class AlunoGrausPK {
  
    @Basic(optional = false)
    @Column(name = "ID_ALUNO", nullable = false)
    private int id_aluno;
    @Basic(optional = false)
    @Column(name = "ID_GRAU", nullable = false)
    private int id_grau;
    @Basic(optional = false)
    @Column(name = "DATA", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date data;



@Entity
@Table(name = "GRAUS")
public class grau {
    
    @Id
    @Column(name = "ID")
    private int id = 0;
    @Column(name = "COR_FAIXA")
    private String cor_faixa = "";
    @Column(name = "CODIGO")
    private int codigo = 0;
    @Column(name = "TIPO")
    private String tipo = "";
    //@ManyToMany(fetch = FetchType.EAGER)
	//@JoinTable(name = "ALUNO_GRAUS", joinColumns = @JoinColumn(name = "ID_GRAU"), inverseJoinColumns = @JoinColumn(name = "ID_ALUNO"))
	//private List<aluno> alunos = new ArrayList<aluno>();

    @OneToMany(mappedBy = "grau")
    private List<aluno_grau> aluno_graus;

Como visto um aluno possui varios aluno_grau. Como persistir isto, não estou comseguindo persistir da maneira normal.

2 Respostas

rimarck

O normal quando se faz o mapeamento OneToMany deste modo, quando você persistir a classe que contem a lista, no caso Aluno, tudo que esta adicionado na lista ( List<aluno_grau> ) também é processado (gravado ou alterado) …

Que erro está ocorrendo?

Andre_Brito

Bom, não sei se você está usando Hibernate, OpenJPA ou outra implementação, mas sei que no Hibernate você só teria as classes Aluno e Grau. A relação seria de OneToMany e, se você optar por criar uma JoinTable, o próprio Hibernate já criaria essa tabela Aluno_Grau. Dependendo de como você configurar o CascadeType, ele poderia até mesmo armazenar tudo nas tabelas e você não teria que se preocupar (pelo menos não a priori) com as outras tabelas.

Dá uma lida na documentação do Hibernate… Pode clearear (e muito) suas ideias :slight_smile:

Boas festas :slight_smile:

Criado 30 de dezembro de 2009
Ultima resposta 31 de dez. de 2009
Respostas 2
Participantes 3