Relação ManyToOne com classe que contém chave composta

542 views
Skip to first unread message

Fernando

unread,
Oct 15, 2010, 3:48:49 PM10/15/10
to java.ce
Galera é o seguinte,

Tenho uma classe A que possui chave composta, sendo assim eu criei uma
outra classe que irá conter essas duas chaves no caso. Até ai tudo
bem, ou seja, eu terei um atributo na classe A anotado com
@EmbeddedId, onde esse atributo será do tipo da classe que contém as
chaves.

Porém, a classe A tem um relacionamento OneToMany com a classe B, logo
na classe A eu terei uma lista do tipo da classe B anotado com
OneToMany(mappedby= "xxx"). Já na classe B eu terei um atributo do
tipo da classe A anotado com @ManyToOne. Nessa anotação @ManyToOne eu
tenho um atributo chamado referencedColumnName.

Então minha dúvida é: o que eu coloco nesse
atributo(referencedColumnName) já que a chave de A é composta?


Melhor Visualizando:

class A {

@EmbeddedId
private Apk id;

@OneToMany(mappedBy = "a")
private List<B> listaB;

}

class Apk {

@Column
private Integer id1;

@Column
private Integer id2;
}

class B {

@ManyToOne
@JoinColumn(name = "aFK" , referencedColumnName "????")
private A a;

}

Diego Ferreira da Silva

unread,
Oct 15, 2010, 4:28:45 PM10/15/10
to jav...@googlegroups.com
Creio que vc tera que utilizar o @joinColumns



2010/10/15 Fernando <trova...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "java.ce" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javace+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javace?hl=pt-BR.




--
Diego Ferreira da Silva
Bacharel em Sistemas de Informação - Uniube
Sun Certified Java Programmer 6
61-8112-2299
http://www.diegosilva.com.br

Matheus Fechine

unread,
Oct 15, 2010, 4:39:24 PM10/15/10
to jav...@googlegroups.com
Essa chave composta é mesmo necessária?

É muito melhor criar uma Unique (campo a, campo b). Quando for salvar, o banco vai gerar exceçao daí vc captura e lança mensagem de erro.

Muito mais simples e assim vc evita uitilizar chave composta.

Esse EmbeddedId é uma tremenda dor de cabeça, principalmente se vc utilizar Criteria para suas consultas.

2010/10/15 Diego Ferreira da Silva <di...@diegosilva.com.br>

Renan Montenegro

unread,
Oct 15, 2010, 4:23:15 PM10/15/10
to jav...@googlegroups.com
Pelo que sei, o referencedColumnName vc coloca o nome da coluna e não do atributo, portanto não terá problema.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "java.ce" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javace+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javace?hl=pt-BR.




--
Renan Teixeira Lima Verde Montenegro

Diogo Souza

unread,
Oct 17, 2010, 10:48:10 AM10/17/10
to jav...@googlegroups.com
Exatamente, o referencedColumnName recebe o nome da coluna no Banco de Dados que tem a relação de integridade estrangeira. Se a referência é feita com apenas uma coluna então essa deverá ser informada, se for mais de uma você pode usar a anotação @JoinColumns que trata de associar o relacionamento com mais de uma coluna no BD.

Att,
Diogo Souza

Graduação em Análise de Sistemas - Fortaleza (CE)
Blog: http://diogosouzac.blogspot.com
Programador USIX Technology
Sun Certified Java Programmer 6.0

Fernando

unread,
Oct 18, 2010, 8:12:01 AM10/18/10
to java.ce

Muito obrigado pela ajuda pessoal...

Realmente o que eu queria fazer foi resolvido utilizando o
@JoinColumns. Porém, estou também a anlisar o que o Matheus falou,
pois realmente já ouvi dizer que se deve evitar o uso do EmbeddedId,
pois pode causar certos problemas. Se puderem me dá dicas sobre
utilizar ou não, fazer formas alternativas como o uso da Unique,
ficaria agradecido...

Att,

Fernando Italo.

Diogo Souza

unread,
Oct 19, 2010, 6:57:01 AM10/19/10
to jav...@googlegroups.com
Bem, nunca ouvi falar dos problemas que o EmbeddedId possa causar (E gostaria de conhecê-los :D), mas as únicas formas que conheço para mapear o id de uma entidade de chave composta é com ele:

@Entity
public class Teste {

  @EmbeddedId
  @AttributeOverrides( { 
              @AttributeOverride(name = "cod1", column = @Column(name = "COD_1")), 
@AttributeOverride(name = "cod2", column = @Column(name = "COD_2")) 
  })
  private MyId id;

}

@Embeddable
public class MyId {

   private int cod1;

   private int cod2;

}

Ou...

@Entity
@IdClass(MyId.class)
public class Teste {

   @Id
   private int cod1;

   @Id
   private int cod2;
}

public class MyId {

   private int cod1;

   private int cod2;

}

Ah, e não esqueça de tornar as classes serializáveis...

Att,
Diogo Souza

Graduação em Análise de Sistemas - Fortaleza (CE)
Blog: http://diogosouzac.blogspot.com
Programador USIX Technology
Sun Certified Java Programmer 6.0




--

Victor Minerva

unread,
Mar 25, 2014, 9:09:18 AM3/25/14
to jav...@googlegroups.com
Alguem me da um HELP! :D

tenho uma classe disciplina:
@Entity
public class Disciplina {

@Id
@GeneratedValue
private Integer id;

private String periodo;

private String nome;

private Integer cargaHoraria;

gettrs e settrs...

e uma classe aluno:
@Entity
public class Aluno {

@Id
@GeneratedValue
private Integer matricula;
private String nome;
private Integer rg;
@Column(nullable = false)
private Integer cpf;

gettrs e settrs...

Então, elas se relacionam e o relacionamento dela é muitos pra muitos. E nessa tabela de relacionamento tenho atributos como notaAv1, notaAv2 e frequencia.. fora as foreign key de aluno e de disciplina.. ou seja:

@Entity
public class AlunoDisciplina implements Serializable{
private static final long serialVersionUID = 2760271939925617254L;

private Double av1;
private Double av2;
private Double av3;
private Double frequencia;

@ManyToOne
@JoinColumn(name="aluno_id", nullable=false)
private Aluno idAluno;

@ManyToOne
@JoinColumn(name="disciplina_id", nullable=false)
private Disciplina idDisciplina;

Preciso utilizar CHAVE COMPOSTA (@Embeddable e @EmbeddedId).. Alguem sabe me dizer como eu faria?
Obrigado a todos desde ja!
Reply all
Reply to author
Forward
0 new messages