Duvida em mapeamento ternário no hibernate

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á…

Att :slight_smile:

@OneToMany @JoinTable(name = "DEP_FUNC", joinColumns = @JoinColumn(name = "DEP_ID"), inverseJoinColumns = @JoinColumn(name = "FUNC_ID")) private Collection<funcionarios> funcionarios;
Eu entendi que é isso que você quis dizer

ou você pode cirar uma classe e criar mas outras classe e da @MappedSuperclass para que o id delas sejão ids de sua main

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 ?

Não, eu tenho 4 tabelas…

Pessoa
Telefone
Tipo

RL_Pessoa_Telefone (onde a chave primaria desta é composta pela chave estrangeira das outras três)

Amigo você tera que criar uma classe com todas as pks que deseja, dando @MappedSuperclass, depois você extenderar ela a sua classe Main

ou você pode fazer assim

@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;
 

Espero ter ajudado

Renan, estou desconfiado que sua normalização esta com problemas.

Você pode dizer pra gente qual o papel desta entidade Tipo nesta relação?

flws

O tipo na jogada é para dizer se o telefone é resindencial, comercial, da casa de mamae, da sogra ou da tia anastacia

Então poderia se fazer as seguintes relações:

a) Person -> Telefone >> 1:N
b) Telefone <- Tipo >> N:1

Chegaria no objetivo sem criar uma tabela associativa, simplificando as anotações.

Que acham?

flws

Mais ou menos isso…

Vou dar um exemplo pratico…

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…

A ideia é que o relacionamento seja ternário…

[quote=fantomas]Então poderia se fazer as seguintes relações:

a) Person -> Telefone >> 1:N
b) Telefone <- Tipo >> N:1

Chegaria no objetivo sem criar uma tabela associativa, simplificando as anotações.

Que acham?

flws[/quote]

Acredito que se eu fizesse assim, com a regra de negócio que possuo em mãos iria duplicar dados…
O meu post anterior cita um exemplo prático…

Entendi…

flws

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=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 :slight_smile:

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”

Dá uma olhada neste link, a implementação deve estar relacionada a isto: http://weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html

flws

Vlw galera, agradeço a todos pela força!!!

Vou me dedicar aqui!!
Abraçõs! :slight_smile:

Vlw galera, agradeço todos pela força!!

Vou me dedicar aqui…
abraçõs!! :slight_smile: