A Foreign key refering MunicipioCep from Cep has the wrong number of column. should be 4

Olá pessoal eu tenho o seguinte [color=red]CENÁRIO ATUAL:[/color] 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. [color=red]CENARIO DESEJADO:[/color] eu quero substituir esse campo por uma classe Município , para relacionar com minha tabela MUNICIPIO.

[color=red]CENARIO DESEJADO:[/color]
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:

[code]@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

}[/code]

[code]@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

}[/code]

[code]@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

}[/code]

[code]@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

}[/code]

classes do cenário desejado: [color=red]CENÁRIO DESEJADO:[/color]

[code]@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
}[/code]

[code]@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
}[/code]

[code]@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

}[/code]

Seguinte, aqui você esta dizendo que o Estado dentro do municipio e tambem dentro de municipiocep

@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),[quote]@JoinColumn(name = "CD_ESTADO", nullable = false) }[/quote])  
    private Municipio municipio;  
      
    [b]@ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "CD_ESTADO", nullable = false)  
    private Estado estado; [/b] 
  
//GET E SET OMITIDOS      
}  

E aqui você está fazendo o join de apenas 2 colunas e o hibernate espera que voce faca 4 colunas:

@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 ={  
    [b]@JoinColumn(name = "CD_MUNICIPIO", nullable = false),@JoinColumn(name = "CD_ESTADO", nullable = false) }[/b])  
    private MunicipioCep municipioCep;  
  
  
    //GET E SET OMITIDOS  
  
} 

Tente deixar assim:

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