HIBERNATE Mapeamento de Chave Composta Primaria e Estrngeira

Oi galera,

estou precisandode ajuda de como fazer o mapeamento do Hibernate para o seguinte caso:

Tenho um sistema legado que, tem duas tabelas: Financeiro e Parametros


— FINANCEIRO

  • NR_ANO (PK FK)
  • NR_MES (PK FK)
  • NR_EMPRESA (PK FK)
  • etc


—Parametros

  • NR_MES(PK)
  • NR_ANO(PK)
  • etc

Queria saber como fazer o mapeamento do Hibernate com Annotations para esse caso, poist já tentei ded iversas formas sem sucesso.

Ai embaixo estão as classe e como implementei. O hibernate não acusa erro de mapeamento mas quando faço uma consulta nao retorna resultados

QUALQUER AJUDA É BEM VINDA!!!

THANKS


import javax.persistence.*;

@Entity  
@Table(name="FINANCEIRO")
public class Financeiro implements Serializable {

	private static final long serialVersionUID = 1L;
 
		 
	
	@EmbeddedId
	private FinanceiroPk financeiroPk;
		
	@Column(name="ST_PAGAMENTO")
	private Integer situacao;

FinanceiroPk



import java.io.Serializable;
import java.util.Vector;

import javax.persistence.*;

import org.hibernate.annotations.Columns;

import sindicalweb.pojo.Empresa;
import sindicalweb.pojo.Parametros;
  
@Embeddable
public class FinanceiroPk implements Serializable {
	
	private static final long serialVersionUID = 1L;
	


	@ManyToOne
	@JoinColumns({
	 @JoinColumn(name="NR_MES"),
	 @JoinColumn(name="NR_ANO")
	})
	private Parametros parametro;
	
	@ManyToOne
	@JoinColumn(name="CD_EMPRESA", nullable=false)
	private Empresa empresa;
	
	public FinanceiroPk(){}
	
	public FinanceiroPk(Parametros parametro, Empresa empresa)
	{
		this.parametro = parametro;
		this.empresa = empresa;
	}
//implementação de hasCode e equals...

Parametros

import javax.persistence.*;

@Entity
@IdClass(ParametrosPk.class)  
@Table(name="PARAMETROS")
public class Parametros implements Serializable {
 
	private static final long serialVersionUID = 1L;
	
	@Id
	private String mes;
	
	@Id
	private String ano;
	

ParametrosPk


import java.io.Serializable;
import java.util.Vector;

import javax.persistence.*;

@Embeddable
public class ParametrosPk implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Column(name="NR_MES")
	private String mes;
	
	@Column(name="NR_ANO")	
	private String ano;
	
	public ParametrosPk(){}
	public ParametrosPk(String mes, String ano)
	{
		this.ano = ano;
		this.mes = mes;
	}

Opa… segue um exemplo…
Primeiramente…
A classe que tem as 2 chaves primarias

[code]@Entity
@IdClass(Classe1Id.class)
public class Classe1 {
@Id
@Column(name="Num1")
private Integer num1;
@Id
@Column(name="Num2")
private Integer num2;

@Column(name="NumCNPJ")
private String numCNPJ;
    // Demais coisas...

}[/code]
Depois a classe que contem SOMENTE as chaves primarias

class Classe1Id implements Serializable { private static final long serialVersionUID = 7513485314188920751L; @Column(name="Num1") private Integer num1; @Column(name="Num2") private Integer num2; // Nessa so vai ter esses kras mesmo }
Classe que contem as FK

[code]@Entity
public class ClasseQTemAsChavesEstrangeiras {
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumns( {
@JoinColumn(name = "Num1"),
@JoinColumn(name = "Num2")
})
private Classe1 suaClasseDasChaves;

// Demais atributos
}[/code]
Qualquer duvida posta ai :joia:

Olá Cassolato,

Desculpe, mas não entendi algumas coisas do que vc disse:

PRIMEIRO: A minha classe que contém as FKs(Financeiro) tem além da outra Classe como fk(Parametro), um atributo do tipo Empresa. Como Mapeio isso, não teria que fazer também uma classe só de PK para ela? E como ficaria esse mapeamento?

SEGUNDO: Na minha classe que contém dois IDs, eu não teria que fazer uma classe para agrupar a a PK Composta? Quais sãos as consequencias de fazer da sua maneira?

Minhas dúvidas são basicamente porque eu acho que teria que criar as classes pk para os dois pojos. Ai me confundo em como fazer esse mapeamento na classe pojo e na sua pk!

Valew, thanks! :lol:

Para mapear uma FK não precisa criar uma outra classe, basta apenas:

@ManyToOne
@NotNull
private Project projeto;

ou se for coleção:

@OneToMany
@NotNull
private List<Project> projetos;

Att.

Entendeu depois da resposta do JUJO ?

A questão é que minha classe tem uma chave primaria COMPOSTA, que é FK!!!

Na tabela Financeiro eu tenho:

  • NR_MES (PK FK)
  • NR_ANO (PK FK)
  • CD_EMRPESA (PK FK)

e em Parametros eu tenho

  • NR_MES (PK)
  • NR_ANO (PK)

Dei uma olhada nos foruns do hibernate e achei que isso não é recomendado, mas o sistema é legado…

Já tentei mapear com insertable=false e updatable=false (como vi nos foruns, mas ele dá erro de mapeamento acusando que NR_MES já foi mapeado…, tentei com EmbbedID mas não deu…

Como vcs fariam o mapeamento com essa estrutura de BD acima???

vlw
thanks

Estou com o mesmo problema, tenho uma chave composta e um dos atributos dessa chave é também uma FK.
Voce conseguiu resolver o seu problema?
Alguem sabe como resolve esse problema?
por exemplo:

@Embeddable
public class ConvenioTlfHistoricoPK implements Serializable{
	private long idaut;

	@Column(name="tarjeta")
	private String nroTarjeta;

	@Column(name="FECHA_NEGOCIO")
	private Date fechaNegocio;
@Entity
@Table(name="convenio.tlf_historico")
public class ConvenioTlfHistorico extends Transacao implements Serializable {
	
	@EmbeddedId
	private ConvenioTlfHistoricoPK pk;
	
	@ManyToOne 
	@JoinColumns(
			@JoinColumn(name="TARJETA",referencedColumnName="CARTAO", insertable=false, updatable=false)
	)
	private Cartoes cartao;

Dessa forma quando executo uma consulta da o seguinte erro: COLUMN AMBIGUOUSLY DEFINED.
Peguei o select gerado pelo Hibernate e percebi que é justamente a coluna Tarjeta.