Fórum org.hibernate.AnnotationException: A Foreign key refering MunicipioCep from Cep has the wrong number of column. should be 4 #503157

02/12/2014

0

Olá pessoal eu tenho o seguinte CENÁRIO ATUAL: tenho o relacionamento das tabelas CEP com MUNICIPIO_CEP, onde na MUNICIPIO_CEP tenho o campo CD_MUNICIPIO o codigo usado na busca do municipio na tabela de municipio. CENARIO DESEJADO: eu quero substituir esse campo por uma classe Município , para relacionar com minha tabela MUNICIPIO.


CENARIO DESEJADO:
Para isso eu criei a classe Município e alterei a classe MunicipioCepPK substituindo o campo codigoMunicipio pela Classe Município e fiz o mapeamento conforme descrito abaixo gerou a seguinte exceptio:
Caused by: org.hibernate.AnnotationException: A Foreign key refering MunicipioCep from Cep has the wrong number of column. should be 4

Não estou conseguindo identificar onde estou errando.

classes do Cenário Atual:

@Entity  
@Table(name = "CEP")  
public class Cep extends BaseEntity {  
      
    private static final long serialVersionUID = -9185450041843009071L;  
  
    @EmbeddedId  
    private CepPK id = new CepPK();  
      
    //GET E SET OMITIDOS  
  
}  


@Embeddable  
public class CepPK implements Serializable {  
  
    private static final long serialVersionUID = 3846381029982040202L;  
  
    @Column(name = "CD_CEP", nullable = true, columnDefinition = "number")  
    private Long cepInicial;  
      
    @Column(name = "CD_CEP_FINAL", nullable = true, columnDefinition = "number")  
    private Long cepFinal;  
      
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumns(value ={  
    @JoinColumn(name = "CD_MUNICIPIO", nullable = false),@JoinColumn(name = "CD_ESTADO", nullable = false) })  
    private MunicipioCep municipioCep;  
  
  
    //GET E SET OMITIDOS  
  
}  


@Entity  
@Table(name = "MUNICIPIO_CEP")  
public class MunicipioCep extends BaseEntity {  
      
  
    private static final long serialVersionUID = -6319980634679638261L;  
  
    @EmbeddedId  
    private MunicipioCepPK id = new MunicipioCepPK();     
      
    @Column(name = "DESCRICAO", length = 50, nullable = true)  
    private String nomeMunicipio;  
  
    //GET E SET OMITIDOS  
  
}  


@Embeddable  
public class MunicipioCepPK implements Serializable {  
      
    private static final long serialVersionUID = -153778943963374738L;  
  
    @Column(name = "CD_MUNICIPIO", nullable = false)  
    private Long codigoMunicipio;  
      
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "CD_ESTADO", nullable = false)  
    private Estado estado;  
  
  
    //GET E SET OMITIDOS  
  
}  


classes do cenário desejado: CENÁRIO DESEJADO:

@Embeddable  
public class MunicipioCepPK implements Serializable {  
  
  
      
    /** 
     *  
     */  
    private static final long serialVersionUID = 5357538271425975331L;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumns(value ={  
    @JoinColumn(name = "SG_UF", nullable = false),  
    @JoinColumn(name = "CD_MUNICIPIO", nullable = false),@JoinColumn(name = "CD_ESTADO", nullable = false) })  
    private Municipio municipio;  
      
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "CD_ESTADO", nullable = false)  
    private Estado estado;  
  
//GET E SET OMITIDOS      
}  


@Entity  
@Table(name = "MUNICIPIO")  
public class Municipio extends BaseEntity {  
      
    private static final long serialVersionUID = -327710204095971540L;  
  
    @EmbeddedId  
    private MunicipioPk municipioPK = new MunicipioPk();  
              
    @Column(name = "NM_MUNICIPIO", length = 50, nullable = false)  
    private String nomeMunicipio;  
          
      
    @Column(name = "CD_MICROREGIAO_MUNICIPIO", nullable = false)  
    private Long microRegiaoMunicipio;  
      
    @Column(name= "ID_LATITUDE_MUNICIPIO", length = 15, precision = 10, scale = 5, nullable = false)  
    private Long latitudeMunicipio;  
      
    @Column(name= "ID_LONGITUDE_MUNICIPIO", length = 15, precision = 10, scale = 5, nullable = false)  
    private Long longitudeMunicipio;      
  
//GET E SET OMITIDOS  
}  


@Embeddable  
public class MunicipioPk implements Serializable{  
  
    private static final long serialVersionUID = -95246462039640510L;  
  
    @Column(name = "CD_MUNICIPIO", nullable = false)  
    private Long municipio;  
      
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "SG_UF", nullable = false)  
    private Uf uf;  
      
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "CD_PAIS", nullable = false)  
    private Pais pais;  
  
    //GET E SET OMITIDOS  
}  
Tiago Figueiredo

Tiago Figueiredo

Responder

Posts

02/12/2014

Ronaldo Lanhellas

De acordo com o seu código mostrado, você está usando @EmbeddedId na classe CEP, apontando para CepPK, o que significa que sua tabela tem uma chave composta com 3 campos, isso confere ?
Responder

Gostei + 0

03/12/2014

Tiago Figueiredo

bom dia Ronaldo, exatamente a classe CEP tem 3 chaves que esta na classe CepPk que são: CD_CEP, CD_MUNICIPIO e CD_ESTADO.
@Column(name = "CD_CEP", nullable = true, columnDefinition = "number")
private Long cepInicial;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns(value ={
@JoinColumn(name = "CD_MUNICIPIO", nullable = false),@JoinColumn(name = "CD_ESTADO", nullable = false) })
private MunicipioCep municipioCep

Isso funciona normalmente, meu problema está no mapeamento da classe MunicipioCep com a Classe Municipio. Pois hoje o campo CD_MUNICIPIO é um Long, o problema está quando eu troco Long pela classe Município na classe MunicipioCepPk

[img:descricao=tabela Município]http://arquivo.devmedia.com.br/forum/imagem/322312-20141203-083859.png[/img]
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar