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

5 respostas
R

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?

5 Respostas

sandroalm.silva

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

R

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

R

Eu criei uma outra classe, para a chave composta

@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;
	}
    
    
}
E a classe produtoRelacao ficou assim:
@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;
}
sandroalm.silva

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 ?

R

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.

Criado 3 de setembro de 2009
Ultima resposta 3 de set. de 2009
Respostas 5
Participantes 2