(Resolvido) Hibernate Annotations - Chave composta por uma mesma coluna

Galera,

Eu tenho uma tabela produto que possui o codigo como chave primaria, e uma tabela produto_relação que tem como chave os codigos de dois produtos e uma coluna com um valor inteiro.

Ex:

Table Produto
Codigo varchar pk

Table produto_relacao
Produto1 varchar FK
Produto2 varchar FK
proporcao int

Alguem sabe como eu mapeio essas entidades?

se eu entendi bem oque voce quer fazer, voce pode mapear normal, porque essa tabela produto_relacao vai apenas fazer um relacionamento UM PRA UM, e cada regristro vai ter um id de cada tabela nesse relacionamento

exemplo :

@JoinColumn(name = “PROD1_ID”, referencedColumnName = “PROD2_ID”)
@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
private Produto produto;

(esse mapeamento é na classe produto_relaciona)

faça o mesmo no produto2, e se eu voce estiver querendo fazer oque eu entendi, vai dar certo :smiley:

qualquer outra dúvida vai no hibernate.org que é super explicativo a documentação

Então, eu acho que não é um pra um, e sim muitos para um.

Deixa eu detalhar melhor as tabelas:

Create table produto(
codigo varchar() pk,
descricao varchar()

)

create table produto_relacao(
codigo_pai varchar(),
codigo_filho varchar(),
proporcao int,
constraint produto_relacao_pk primary_key (codigo_pai, codigo_filho),
constraint produto_pai foreign_key (codigo_pai) references produto.codigo,
constraint produto_filho foreign_key (codigo_filho) references produto.codigo
)

Eu estou olhando o mateiral do hibernate.org mas tá meio dificil!! rs

Eu criei uma outra classe, para a chave composta

[code]@Embeddable
public class ProdutoRelacaoPK implements Serializable{
@Basic(optional = false)
@Column(name = “produto_codigo_pai”, length=30)
private String codigoPai;
@Basic(optional = false)
@Column(name = “produto_codigo_filho”, length=30)
private String codigoFilho;

public void setCodigoPai(String codigoPai) {
	this.codigoPai = codigoPai;
}
public String getCodigoPai() {
	return codigoPai;
}
public void setCodigoFilho(String codigoFilho) {
	this.codigoFilho = codigoFilho;
}
public String getCodigoFilho() {
	return codigoFilho;
}

}[/code]

E a classe produtoRelacao ficou assim:

[code]@Entity
@Table(name = “produto_relacao”)
public class ProdutoRelacao implements Serializable{

private static final long serialVersionUID = 1L;

@EmbeddedId
protected ProdutoRelacaoPK produtoRelacaoPK;

@JoinColumn(name = "produto_codigo_pai", referencedColumnName = "prod_cod", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Produto pai;

@JoinColumn(name = "produto_codigo_filho", referencedColumnName = "prod_cod", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Produto filho;

@Column(name="filhos_para_pai",
		nullable=false)
private float filhosParaPai;

}[/code]

cara, o relacionamento doque voce ta tentando fazer é um pra um sim pelo oque eu entendi,

essa tabela produto_relaciona, vai guardar o id de um produto pai , que será relacionado com outro produto filho.
cada produto_relaciona só vai ter UM filho e UM pai, não é mesmo ?

ah, é que isso eu não especifiquei mesmo… falha minha.

Um produto pai pode ter vários filhos, e um produto filho pode ter vários pais.