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

1 resposta
T

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:
@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: [color=red]CENÁRIO DESEJADO:[/color]

@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
}

1 Resposta

A

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),<blockquote>@JoinColumn(name = "CD_ESTADO", nullable = false) }</blockquote>)  
    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      
}
Criado 2 de dezembro de 2014
Ultima resposta 6 de dez. de 2014
Respostas 1
Participantes 2