[RESOLVIDO] JPA - Chave Composta

6 respostas
M

Caros, estou trabalhando com Chave Composta , com JPA (EclipseLink) , e o banco de dados não contém chave estrangeira e preciso fazer um relacionamento com duas colunas.

Segue exemplo do que tenho até então:

@Entity
@Table ( name = "Alunos" )
public class Aluno implements Serializable {
    
    @Id   
    @Column(name = "codigo", nullable = false)
    private Integer codigo;
          
    @Column(name = "area", nullable = false)
    private String area;

    //Resto dos campos
    @Column(name = "nome", nullable = false)
    private String nome;

}
@Entity
@Table ( name = "AlunosEmTurma" )
public class AlunosEmTurma implements Serializable {
    
    @Column(name = "area", nullable = false)
    private Integer area; //area da Turma
          
    @Column(name = "Aluno", nullable = false)
    private Integer Aluno; //codigo do aluno

    @JoinColumn(name="codigo", nullable=true, insertable=false, updatable=false)
    @OneToMany()
    private List<Aluno> oAluno;  

    //Resto dos campos
    @Column(name = "Turma", nullable = false)
    private Integer turma;
}

O aluno só se relaciona até então pelo Código, porém ele terá que começar a se relacionar também por Àrea (ensino médio, ensino fundamental, etc).
Ou seja, como farei para relacionar o meu AlunoEmTurma com um Aluno levando em consideração que dois alunos poderão ter o mesmo código, sendo diferenciados pela àrea?

6 Respostas

A

O ideal é que cada aluno tenha um ID único no sistema, assim você pode relacionar área, turma, etc, com o ID dele.

M

Concordo contigo. rs
Porém infelizmente este é um sistema legado, ainda preciso trabalhar desta forma.

asandrob

Área (ensino médio, ensino fundamental, etc) me parecem ser atributos da turma, essa sim tem muitos alunos.
Pois não vejo sentido em um aluno estar no ensino medio e ensino fundamental ao mesmo tempo.

M

O sistema é totalmente amarrado à área. Não vai ter como fugir das áreas, infelizmente.
Creio até então que a saída será fazer uma chave composta no JPA , porém não consegui coloca-la em prática.

G

Se você estiver usando um relacionamento de campos índices, talvez isso funcione (funciona em um projeto meu):

@JoinColumns({ @JoinColumn(name="area", nullable=false, insertable=false, updatable=false ), @JoinColumn(name="codigo", nullable=false, insertable=false, updatable=false) }) @OneToMany() private List<Aluno> oAluno;

Se quiser trocar uma ideia, MP-me.

M

Valeu cara, deu certo aqui!!

Criado 30 de agosto de 2012
Ultima resposta 31 de ago. de 2012
Respostas 6
Participantes 4