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.
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:
[code]
@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
} [/code]
pra falar a verdade eu não testei isso ainda. Mas eu encontrei isso daqui na documentação do hibernate annotationshttp://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier :
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.
[code]
@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;
}[/code]
In this case Customer being it’s own identifier representation, it must implement Serializable.