PFK Composta

7 respostas
joparibeiro

E ai galera.

Estou iniciando meus aprendizados em JPA e me deparei com a situação:
Tenho as entidades Pessoa e Endereco, sendo que uma pessoa pode ser composta por muitos endereços.
Tendo em vista que eu tenho um relacionamento forte entre estas duas entidades, a PK de Pessoa deve compor a PK de Endereco, junto com um outro campo sequencial que eu costumo chamar de sequencia. Como devo mapear este relacionamento no JPA com annotations?

Desde já, agradeço.

7 Respostas

T

Olá joparibeiro,

talvez esses tópicos lhe ajude:

http://www.guj.com.br/java/274722-chave-composta-no-jpa
http://www.guj.com.br/java/204454-resolvido–mapeamento-de-chave-composta-no-hibernate-usando-annotation

Abraço

joparibeiro

Mais alguém ?

Hebert_Coelho

joparibeiro:
Mais alguém ?
O post que o thiaguten citou tem links lá que mostram como fazer a chave composta com campo extra. Tentou utilizar o campo extra e colocar a Sequence lá?

joparibeiro
Hebert Coelho:
joparibeiro:
Mais alguém ?
O post que o thiaguten citou tem links lá que mostram como fazer a chave composta com campo extra. Tentou utilizar o campo extra e colocar a Sequence lá?

Funcionou parcialmente, Hebert.
Segue abaixo as classes Pessoa, Email e EmailId (que tem a mesma lógica de mapeamento entre Pessoa e Endereco).
O Hibernate criou a FK pessoa_id na tabela Email mas não colocou-a na chave primária junto com o campo Id.

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa implements Serializable {
 
	private static final long serialVersionUID = 450732004114951766L;

	@Id
	protected Long id;
	 
	@Column(length=50, nullable=false)
	protected String nome;
	 
	@Temporal(TemporalType.DATE)
	protected Calendar dataNasc;
	
	@Column(length=250)
	protected String obs;
	 
	@OneToMany(mappedBy="id.pessoa")
	protected Set<Email> emails;
	
}
@Entity
public class Email implements Serializable {
 	
	private static final long serialVersionUID = 2896169431501590500L;
	
	@EmbeddedId
	private EmailId id;
	 
	@Column(length=50, nullable=false)
	private String email;
	 
	@Column(length=50)
	private String descricao;	
	
}
@Embeddable
public class EmailId implements Serializable {	
	
	private static final long serialVersionUID = -4839635656649864831L;

	@ManyToOne
	private Pessoa pessoa;

	private Integer id;

}

Imports, getters e setters omitidos.

Se alguém mais puder ajudar, agradeço.

Hebert_Coelho

joparibeiro:
Funcionou parcialmente, Hebert.
Segue abaixo as classes Pessoa, Email e EmailId (que tem a mesma lógica de mapeamento entre Pessoa e Endereco).
O Hibernate criou a FK pessoa_id na tabela Email mas não colocou-a na chave primária junto com o campo Id.

Você vai setar o ID na mão? ou Vai querer que seja gerado automático? Se for automático está faltando o GeneratedValue

joparibeiro

Hebert Coelho:
joparibeiro:
Funcionou parcialmente, Hebert.
Segue abaixo as classes Pessoa, Email e EmailId (que tem a mesma lógica de mapeamento entre Pessoa e Endereco).
O Hibernate criou a FK pessoa_id na tabela Email mas não colocou-a na chave primária junto com o campo Id.

Você vai setar o ID na mão? ou Vai querer que seja gerado automático? Se for automático está faltando o GeneratedValue

Vou setar manualmente pois quero que a PK siga a seguinte regra:

(pessoa_id, id)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(2, 1)
(3, 1)
(3, 2)
(3, 3)
(3, 4)
(4, 1)
(4, 2)

joparibeiro

Resolvido amigos.

Obrigado a todos que ajudaram.

Segui http://andrejavaeflex.blogspot.com.br/2009/10/em-criacao.html e consegui implementar.

Abraços.

Criado 4 de outubro de 2012
Ultima resposta 5 de out. de 2012
Respostas 7
Participantes 3