Saudações galera não estou conseguindo fazer um mapeamento (por anotation) de um relacionamento ternário entre Pessoa, Telefone e tipo.
Lembrando, o relacionamento é ternário, ou seja, não existe tal relação se as três partes não estiverem envolvidas… Em nível de banco as três PK das entidades se tornariam uma chave composta…
Alguém sabe me exemplificar como ficaria tal mapeamento?
Agradeço desde já…
Sim, é mais ou menos isso que eu estava imaginando…
Criar uma terceira classe
public class PersonHasPhone implements Serializable {
private static final long serialVersionUID = 1L;
private Person person;
private Phone phone;
private PhoneType phoneType;
// gets, sets, hash e equals
}
Voce tem e a tabela pessoa, phone e na tabela phone voce quer fazer uma chave primaria composta pelo id da pessoa pelo id do phone e pelo tipo do fone é isso mesmo ?
@Embeddable
public class CarPK implements Serializable {
@Column
private Long chassisSerialNumber;
@Column
private Long engineSerialNumber;
public CarPK(){
// A classe deve ter um construtor no-arg
}
agora você vai adcionar esses ids a sua classe
@Entity
@Table(name = "CAR")
public class Car {
// passando os ids compostos
@EmbeddedId
private CarPK carPK;
Imagine no contexto de uma agenda onde duas pessoas possuem o mesmo telefone…
Por exemplo, João e José são irmãos.
João possui o telefone x do tipo particular…
Nesta agenda o José também possui o telefone x, porém este telefone é apenas para contato…
Outra situação é a mesma pessoa relacionada mais de uma vez com o próprio telefone, porém com o tipo diferente…
Afinal de contas o mesmo telefone pode ser usado para varias funcionalidades, ou seja, João também pode estar relacionado com o telefone x, entretanto com o tipo comercial…
Neste caso acredito que a suposta entidade associativa, deixa de ser associativa (entidade fraca) para ser uma entidade forte por causa do tipo, fazendo com que a relação fique assim:
a) Person -> (person, telefone, tipo) >> 1:N
b) Telefone -> (person, telefone, tipo) >> 1:N
c) (person, telefone, tipo) <- Tipo >> N:1
[quote=fantomas]Neste caso acredito que a suposta entidade associativa, deixa de ser associativa (entidade fraca) para ser uma entidade forte por causa do tipo, fazendo com que a relação fique assim:
a) Person -> (person, telefone, tipo) >> 1:N
b) Telefone -> (person, telefone, tipo) >> 1:N
c) (person, telefone, tipo) <- Tipo >> N:1
Fiz meio rapidinho vê se dá certo.
flws[/quote]
Sim realmente esta é a modelagem
O problema que estou tendo mesmo é para mapear esta relação…
Como que vou dizer ao hibernate que estas três entidades compõe a minha chave primária?
Não quero criar simplesmente um ID sobressalente, pois terei que garantir em código muitos tratamentos que o próprio SGBD já traz encapsulado…
A dúvida é realmente em como falar para o hibernate que as chaves primárias destas três classes compõem a chave primaria da entidade de “relacionamento”