Pessoa, tenho um relacionamento Aluno - Livro, por exemplo.
Aluno tem uma chave composta, constituída de matricula e cpf. Vejam o mapeamento:
package framework.classesTeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.EmbeddedId;
import javax.persistence.OneToMany;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import javax.persistence.FetchType;
import java.util.Collection;
@Entity
@Table(name = "aluno",schema="")
public class Aluno {
@EmbeddedId
AlunoCompositePK alunocompositepk;
@OneToMany(mappedBy="aluno", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Livro> livro;
public Aluno() {
}
public void setAlunoCompositePK( AlunoCompositePK alunocompositepk ){
this.alunocompositepk = alunocompositepk;
}
public AlunoCompositePK getAlunoCompositePK(){
return this.alunocompositepk;
}
public void setLivroCollection(Collection<Livro> livro) {
this.livro = livro;
}
public Collection<Livro> getLivroCollection(){
return this.livro;
}
}
A classe que representa a composite id é:
package framework.classesTeste;
import javax.persistence.Embeddable;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Id;
@Embeddable
public class AlunoCompositePK implements Serializable {
public AlunoCompositePK() {
}
@Id
@Column(name="", unique=false, insertable=true, columnDefinition="", scale=0)
private int matricula;
@Id
@Column(name="", unique=false, insertable=true, columnDefinition="", scale=0)
private String cpf;
public void setMatricula( int matricula ){
this.matricula = matricula;
}
public int getMatricula(){
return this.matricula;
}
public void setCpf( String cpf ){
this.cpf = cpf;
}
public String getCpf(){
return this.cpf;
}
}
package framework.classesTeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
@Entity
@Table(name = "Livro",schema="")
@SequenceGenerator(name="livro_seq",sequenceName="livro_id_seq")
public class Livro {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "livro_seq")
@Column(name="idLivro", unique=false, insertable=false, columnDefinition="", scale=0)
private int idlivro;
@Column(name="nome", unique=false, insertable=true, columnDefinition="", scale=0)
private String nome;
public void setIdLIvro( int idlivro ){
this.idlivro = idlivro;
}
public int getIdLIvro(){
return this.idlivro;
}
public void setNome( String nome ){
this.nome = nome;
}
public String getNome(){
return this.nome;
}
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
@JoinColumn(name="aluno_matricula", insertable = true, updatable = true)
private Aluno aluno;
public Livro() {
}
public void setAluno( Aluno aluno ){
this.aluno = aluno;
}
public Aluno getAluno(){
return this.aluno;
}
}
No entanto, só tá mapeando uma das chaves, e está dando erro. Gostaria que me ajudassem, pois não sei como mapear para a chave composta. Conto com vocês! Obrigado!