JPA (HIBERNATE) - Mapear chave estrangeira (FK) composta!

5 respostas
E

Prezados,

hipoteticamente possuo uma Entidade EMPRESA (ID_NOME, ID_CNPJ, TELEFONE) e uma Entidade CARGO(CARGO_ID, NOME, REMUNERACAO) que possui um relacionamento ManyToOne com EMPRESA.

Sabendo que ID_NOME e ID_CNPJ são uma chave composta da entidade EMPRESA,
como faço para que a tabela CARGO possua em sua estrutura ID_NOME e ID_CNPJ como colunas?

Como é o mapeamento em JPA nesta situação?

Gostaria que a estrutura ficasse assim!
EMPRESA (ID_NOME, ID_CNPJ, TELEFONE)
CARGO(CARGO_ID, NOME, REMUNERACAO, NOME_EMPRESA, CNPJ_EMPRESA)

Desde já, agradeço a cooperação!

5 Respostas

F

Teste assim na entidade cargo

@ManyToOne
	@JoinColumns({
			@JoinColumn(name = "NOME_EMPRESA", referencedColumnName = "NOME_EMPRESA", nullable = false, insertable = false, updatable = false),
			@JoinColumn(name = "CNPJ_EMPRESA", referencedColumnName = "CNPJ_EMPRESA", nullable = false, insertable = false, updatable = false),
			})
	private Empresa empresa;
E

Olá fdiaz2011! Obrigado por responder!

Eu fiz o que você falou, porém deu o seguinte erro:
[color=red]
Caused by: org.hibernate.AnnotationException: A Foreign key refering Empresa from Cargo has the wrong number of column. should be 2[/color]

Segue abaixo as classes: Empresa
public class Empresa {
	@EmbeddedId
	private EmpresaPK idEmpresa;

	@Column(name = "TELEFONE", nullable = false)
	private String telefone;
	
	//Getters and Setters...
}
EmpresaPK
@Embeddable
public class EmpresaPK {
	@Column(name = "ID_NOME", nullable = false)
	private String idNome;

	@Column(name = "ID_CNPJ", nullable = false)
	private String idCnpj;
	
	//GETTERS AND SETTERS...
}
Cargo
public class Cargo {
	@Id
	@GeneratedValue
	@Column(name = "CARGO_ID", nullable = false)
	private BigDecimal idCargo;

	@Column(name = "NOME", nullable = false)
	private String nome;

	@Column(name = "REMUNERACAO", nullable = true)
	private BigDecimal remuneracao;
	
	
	@ManyToOne  
    @JoinColumns({  
            @JoinColumn(name = "NOME_EMPRESA", referencedColumnName = "ID_NOME", nullable = false, insertable = false, updatable = false),  
            @JoinColumn(name = "CNPJ_EMPRESA", referencedColumnName = "ID_CNPJ", nullable = false, insertable = false, updatable = false),  
            })  
    private Empresa empresa; 
}
F

Cara, eu não tenho muita experiencia com chave composta, mas tenta o seguinte.

@EmbeddedId

@AttributeOverrides({

@AttributeOverride(name = idNome, column = @Column(name = ID_NOME, nullable = false)),

@AttributeOverride(name = idCnpj, column = @Column(name = ID_CNPJ, nullable = false)) })

private EmpresaPK idEmpresa;
E

Ih companheiro, não deu certo aqui não, mas creio que o caminho é usar o @AttributeOverrides . Tentando aqui.

E

Alguém sabe mapear uma chave estrangeira composta???

Criado 20 de junho de 2013
Ultima resposta 22 de jun. de 2013
Respostas 5
Participantes 2