JPA - Como mapear agregação simples - cardinalidade - 0 ou 1

11 respostas
B

Bom dia Pessoal!,

Como mapear uma agregação simples de cardinalidade 0 ou 1.

Um menino pode ter somente um gato ou nenhum.

public class Menino {
   @Id
   private int id;

   @OneToOne
   @JoinColumn(name = "gato_id")
   private Gato gato;

//métodos de acesso omitidos
}

se o menino não tiver o gato, na tabela menino haverá uma FK gato_id, que irá ficar “null”

não sei como fazer isso?

se colocar uma FK “menino_id” na tabela gato e mapear por “Menino”

é correto? ou é gambiarra?

ex.

@Entity
public class Menino {
   @Id
   private int id;

   @OneToOne(mappedBy = "menino")
   private Gato gato;

//métodos de acesso omitidos
}
@Entity
public class Gato {
   @Id
   private int id;
   
  @OneToOne
  @JoinColumn(name = "menino_id")
   private Menino menino;

//métodos de acesso omitidos
}

neste caso o mapeamento “mappedBy” está no lado forte do relacionamento

acho que é o único jeito de fazer

11 Respostas

R

melhor vc colocar o id_menino na tabela do gato

R

vc tb pode utilizar o id_menino sendo a chave primaria na tabela gato

B

então aquela “regra”

“o mappedBy (mapeamento PK) de um para um - tem que ficar na parte fraca do relacionamento, tem que ficar no lado - estar pertencido - não existe?”

posso mapear do jeito que for necessário?

lembrando que se der para obedecer esta “regra” é recomendável?

R

dá uma lida aqui:

http://javafree.uol.com.br/viewtopic.jbb?t=882419&page=1&Relacionamento-Hibernate-OneToOne.html

como não pode existir gato sem um menino, vc pode setar o id do menino no gato , quando vc for criar um gato, pois o menino já existe.

qualquer coisa posta ai.

B

tranquilo rjbcordeiro, obrigado

agora está claro

li na apostila da k19 que o mappedBy a gente pode usar como quiser, dependendo do tipo do relacionamento

uma outra coisa

neste link seu do javafree, tem a anotação @PrimaryKeyJoinColumn

por exemplo

a PK da tabela gato poderia receber a PK da tabela menino?

para isso que serve esta anotação?

isso é regra normal de banco de dados? pode ser feito para relacionamentos OneToOne?

uma PK de uma tabela filha receber uma PK de uma tabela pai, formando um relacionamento?

B

acho meio estranho isso

PK recebendo PK de outra tabela

se eu tiver mais gatos? pertencidos a diversos donos?

acho bom não utilizar isso não

R

então seu relacionamento não é 1 para 1

R

se um menino tiver 1 ou mais gatos o relacionamento é @oneToMany.
Bom tudo vai depender de como é sua regra de negócio não?

R

Bruno Reis:
acho meio estranho isso

PK recebendo PK de outra tabela

se eu tiver mais gatos? pertencidos a diversos donos?

acho bom não utilizar isso não

Na verdade isto não é estranho não, veja o seguinte:
Se , no caso, só vai existir um gato se tiver um dono e o relacionamento é 1 para 1, suponho que a chave primaria do seu Menino seja auto_incremento, então o proprio banco esta certificando que só vai existir um id para cada menino.
Então quando vc criar um gato e atrelar ele ao menino, se vc usar a mesma chave primaria do menino, vc já esta certificando que aquela chave ( do gato agora) é unica.

Voce pode fazer do jeito que vc quizer entende.
Mas no relacionamento 1 - 1 pode-se fazer de algumas formas:
1- cada um tem sua chave primaria
2- um pega a chave primaria do outro(menino com gato pode ) ehehe

vc pode verificar qual o melhor para vc

B

valeu rjbcordeiro

obrigado pela força aí

muito grato!

Bruno

R

olha fiz um exemplo aqui, não testei direito não, mas dá uma olhada:

@Entity
@Table(name="menino")
@SequenceGenerator(name="seq_menino_id",sequenceName="seq_menino_id",allocationSize=1,initialValue=1)
public class Menino {
    
    @Id
    @GeneratedValue(generator="seq_menino_id",strategy= GenerationType.SEQUENCE)
    @Column(name="id_menino")
    private Long idMenino;
    
    @OneToOne(fetch= FetchType.LAZY, mappedBy="menino")
    private Gato gato;
    private String nome;


//gets and setts

}


//classe gato
@Entity
@Table(name="gato")
public class Gato {

    @Id
    @Column(name="id_gato")
    private Long id;

    @Id
    @OneToOne
    @PrimaryKeyJoinColumn(name="id_gato",referencedColumnName="id_menino")
    private Menino menino;

//gets and setts

}

acho que é mais ou menos isto.

Criado 29 de julho de 2011
Ultima resposta 29 de jul. de 2011
Respostas 11
Participantes 2