Hibernate - Relacionamento Many To One com composite Id

1 resposta
J

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;

	}

}
E a classe de Livro é:
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!

1 Resposta

Lavieri
o composite ID, não usa as tags @Id nele... vc deve fazer assim
package framework.classesTeste;  
import javax.persistence.Embeddable;  
import java.io.Serializable;  
import javax.persistence.Column;  
import javax.persistence.Id;  
  
@Embeddable  
public class AlunoPK implements Serializable {  
    
    /**
     * Construtor existente apenas para a unidade de persistencia
     * @deprecated Não é utilizado pois setar matricula e cpf é obrigatorio
     */
    protected @Deprecate AlunoPK() {matricula=null;cpf=null;}  
    
    public AlunoPK(Integer matricula, String cpf) {
        this.matricula = matricula;
        this.cpf = cpf;
    }
  
    @Column(name=&quot;matricula&quot;)  
    private final Integer matricula; 
  
    @Column(name=&quot;cpf&quot;)  
    private final String cpf;
  
    public Integer getMatricula(){
        return this.matricula;  
    }  
  
    public String getCpf(){  
        return this.cpf;  
    }  

     // ===&gt;IMPORTANTE &lt;===
     // vc deve sempre escrever o equals e hashcode de suas entidades e chaves compostas
     // se não sabe fazer.... de uma olhana no forum do GUJ tem varias duvidas sobre composite id q eu respondi
     // ou entaum olhe meu blog, na minha assinatura, la ensina a fazer o equals e hashcode
  
}

outra observação ... IDs nao podem ter seus valores com sets... eles sao imutaveis, nao saia colocando sets em ID...

Criado 15 de maio de 2009
Ultima resposta 16 de mai. de 2009
Respostas 1
Participantes 2