Mapeamento de chave composta

Pessoal,

seguinte eu preciso fazer o mapeamento de um entidade que possui duas chaves estrangeiras como chave primária. Gostaria de saber como faço isso?

eu tentei fazer assim:

@Entity
@Table(name = "siabmtb003_perfilbiometrico")
@SequenceGenerator (name="id_perfilbiometrico_seq", sequenceName="id_perfilbiometrico_seq")
public class PerfilBiometrico implements Serializable {

	private static final long serialVersionUID = 1L;
	private PerfilBiometricoPK idComposta;
	private Byte[] template;
	private Integer qualdidadeTemplate;
	private Boolean dedoAusente;

	@EmbeddedId
	@GeneratedValue(generator = "id_perfilbiometrico_seq")
	public PerfilBiometricoPK getIdComposta() {
		return idComposta;
	}

	public void setIdComposta(PerfilBiometricoPK idComposta) {
		this.idComposta = idComposta;
	}

	@Column(name = "bi_template")
	public Byte[] getTemplate() {
		return template;
	}

	public void setTemplate(Byte[] template) {
		this.template = template;
	}

	@Column(name = "nu_qualidadetemplate")
	public Integer getQualdidadeTemplate() {
		return qualdidadeTemplate;
	}

	public void setQualdidadeTemplate(Integer qualdidadeTemplate) {
		this.qualdidadeTemplate = qualdidadeTemplate;
	}

	@Column(name = "ic_dedoausente", nullable = false)
	public Boolean getDedoAusente() {
		return dedoAusente;
	}

	public void setDedoAusente(Boolean dedoAusente) {
		this.dedoAusente = dedoAusente;
	}
	
	
}

declarei uma variavei do tipo perfilbiométricoPK que é uma classe e está assim:

@Embeddable
public class PerfilBiometricoPK implements Serializable{

	private static final long serialVersionUID = 1L;
	private Cadastro idCadastro;
	private TipoDedo idTipoDedo;
	
	@ManyToOne (fetch=FetchType.LAZY)
	@Cascade (CascadeType.SAVE_UPDATE)
	@JoinColumn (name = "co_cadastro_fk")
	public Cadastro getIdCadastro() {
		return idCadastro;
	}
	public void setIdCadastro(Cadastro idCadastro) {
		this.idCadastro = idCadastro;
	}
	@ManyToOne (fetch=FetchType.LAZY)
	@Cascade (CascadeType.SAVE_UPDATE)
	@JoinColumn (name = "co_tipodedo_fk")
	public TipoDedo getIdTipoDedo() {
		return idTipoDedo;
	}
	public void setIdTipoDedo(TipoDedo idTipoDedo) {
		this.idTipoDedo = idTipoDedo;
	}
}

só que está ocorrendo o seguinte erro:

org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: br.yyy.xxx.seguranca.siabm.entidade.PerfilBiometrico.idCadastro

alguém pode me ajudar?

Olha, peguei um projeto que já tinho isso pronto mas não é igual ao que tu fez não.
Tenta isso aqui:

Na classe principal

tira # @SequenceGenerator (name=“id_perfilbiometrico_seq”, sequenceName=“id_perfilbiometrico_seq”)

porque se tem chave primária composta não precisa de sequence.

ao mapear o id coloca só o nome dos atributos que fazem parte da chave primária

@EmbeddedId
@AttributeOverrides( {
@AttributeOverride(name = "idCadastro", column = @Column(name = "co_cadastro_fk", nullable = false)) 
@AttributeOverride(name = "idTipoDedo", column = @Column(name = "co_tipodedo_fk", nullable = false)) })

Na outra classe PerfilBiometricoPK tem que tirar isso tudo, não dá pra mapear a classe, só o id delas

@ManyToOne (fetch=FetchType.LAZY)

@Cascade (CascadeType.SAVE_UPDATE)

@JoinColumn (name = “co_cadastro_fk”)

public Cadastro getIdCadastro() {

coloca só


   @Column(name = "co_cadastro_fk", nullable = false)
   private  Integer idCadastro;  


  @Column(name = "co_tipodedo_fk", nullable = false)
  private Integer idTipoDedo;  

e ainda tem que incluir um contrutor
onde passa todos os parametros


PerfilBiometricoPK( Integer idCadastro, Integer idTipoDedo) 

Olá,

Um tempo atrás eu precisei fazer isso e tomei como referência estes posts:
http://www.guj.com.br/posts/list/134922.java
http://www.guj.com.br/posts/list/139085.java

Talvez te ajude,
Wallfox

Obrigado pessoal, consegui resolver.

Posta a solução ai! Isso ajuda caso de outras duvidas sobre o mesmo assunto!

At.
Wallfox

eu fiz assim:

primeira a classe que possui o id de chave composta:

@Entity
@Table(name = "siabmtb003_perfilbiometrico")
//@SequenceGenerator(name = "perfilbiometrico_seq", sequenceName = "perfilbiometrico_seq")
//@IdClass(PerfilBiometricoPK.class)
public class PerfilBiometrico implements Serializable {

	private static final long serialVersionUID = 1L;
	private PerfilBiometricoPK idComposta;
	private Byte[] template;
	private Integer qualdidadeTemplate;
	private Boolean dedoAusente;
	private Cadastro cadastroFK;
	private TipoDedo tipoDedoFK;

	@EmbeddedId
//	@GeneratedValue(generator = "perfilbiometrico_seq")
	public PerfilBiometricoPK getIdComposta() {
		return idComposta;
	}

	public void setIdComposta(PerfilBiometricoPK idComposta) {
		this.idComposta = idComposta;
	}

	@Column(name = "bi_template")
	public Byte[] getTemplate() {
		return template;
	}

	public void setTemplate(Byte[] template) {
		this.template = template;
	}

	@Column(name = "nu_qualidadetemplate")
	public Integer getQualdidadeTemplate() {
		return qualdidadeTemplate;
	}

	public void setQualdidadeTemplate(Integer qualdidadeTemplate) {
		this.qualdidadeTemplate = qualdidadeTemplate;
	}

	@Column(name = "ic_dedoausente", nullable = false)
	public Boolean getDedoAusente() {
		return dedoAusente;
	}

	public void setDedoAusente(Boolean dedoAusente) {
		this.dedoAusente = dedoAusente;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@Cascade(CascadeType.SAVE_UPDATE)
	@JoinColumn(name = "co_cadastro_fk", nullable=false, insertable=false, updatable=false)
	public Cadastro getCadastroFK() {
		return cadastroFK;
	}

	public void setCadastroFK(Cadastro cadastroFK) {
		this.cadastroFK = cadastroFK;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@Cascade(CascadeType.SAVE_UPDATE)
	@JoinColumn(name = "co_tipodedo_fk", nullable=false, insertable=false, updatable=false)
	public TipoDedo getTipoDedoFK() {
		return tipoDedoFK;
	}

	public void setTipoDedoFK(TipoDedo tipoDedoFK) {
		this.tipoDedoFK = tipoDedoFK;
	}

}

Depois a classe que possue as chaves estrangeiras:

@Embeddable
public class PerfilBiometricoPK implements Serializable {

	private static final long serialVersionUID = 1L;
	private Cadastro idCadastro;
	private TipoDedo idTipoDedo;

	@Column(name = "co_cadastro_fk", nullable = false)
	public Cadastro getIdCadastro() {
		return idCadastro;
	}

	public void setIdCadastro(Cadastro idCadastro) {
		this.idCadastro = idCadastro;
	}

	@Column(name = "co_tipodedo_fk", nullable = false)
	public TipoDedo getIdTipoDedo() {
		return idTipoDedo;
	}

	public void setIdTipoDedo(TipoDedo idTipoDedo) {
		this.idTipoDedo = idTipoDedo;
	}

}