Hibernate Annotations - ManyToMany de duas tabelas e não três

2 respostas
R

Pessoal,

Como ficariam as anotações das seguintes tabelas:

create table produto(
id int,
descricao varchar
);

CREATE TABLE produto_relacao
(
id_pai int,
id_filho int,
cardinalidade real,
CONSTRAINT produto_relacao_pk PRIMARY KEY (id_pai, id_filho),
CONSTRAINT id_filho_fk FOREIGN KEY (id_filho) REFERENCES produto (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT id_pai_fk FOREIGN KEY (id_pai) REFERENCES produto (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
)

O que eu tenho até agora é:

@Table(name="produto")
public class Produto {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;
	private String codigo;
}

e

@Entity
@Table(name="produtoRelacao")
public class ProdutoRelacao {

	@Id
	private Produto produtoPai;
	
	@Id
	private Produto produtoFilho;
	
	private double cardinalidade;
	
}

A particularidade desse caso é que eu quero mapear a relação entre objetos da mesma entidade, e não entre duas entidades diferentes.

Alguem tem alguma dica?

Ah, e eu gostaria de ter um produto e acessar e setar seus filhos e suas cardinalidades.

Abraços.

2 Respostas

marcos1EM

rdmegna eu n sei examente como seria o auto-relacionamento no hibernate , mas uma coisa q observei é q vc tem dois atributos com a anotação @id, vc sabe se isso realmente funciona?
pq eu por exemplo quando tenho chave composta eu crio uma outra classe para fazer o mapeamento das chaves, no seu contexto eu tentaria assim:

@Embeddable // a classe sera usada como identificador
public class ChaveCompostaPR implements {


    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_pai", referencedColumnName="id")
    private Produto produtoPai;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_filho", referencedColumnName="id")
    private Produto produtoFilho

//gets e sets	

}

 @Entity  
 @Table(name="produtoRelacao")  
 public class ProdutoRelacao {  

    @EmbeddedId //utilizando a classe como identificador
    private ChaveCompostaPR chave;  
       
//gets e sets
       
 }
R

pra falar a verdade eu não testei isso ainda. Mas eu encontrei isso daqui na documentação do hibernate annotations[url]http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier[/url] :

2.2.3.2.2. Multiple @Id properties

Another, arguably more natural, approach is to place @Id on multiple properties of my entity. This approach is only supported by Hibernate but does not require an extra embeddable component.
@Entity
class Customer implements Serializable {
  @Id @OneToOne
  @JoinColumns({
    @JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
    @JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
  })
  User user;
  
  @Id String customerNumber;

  boolean preferredCustomer;
}

@Entity 
class User {
  @EmbeddedId UserId id;
  Integer age;
}

@Embeddable
class UserId implements Serializable {
  String firstName;
  String lastName;
}
In this case Customer being it's own identifier representation, it must implement Serializable.
Criado 4 de agosto de 2010
Ultima resposta 4 de ago. de 2010
Respostas 2
Participantes 2