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
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.