[RESOLVIDO] GenericJDBCException: Field 'codPais' doesn't have a default value

O Hibernate está levantando esta exceção:

 org.hibernate.exception.GenericJDBCException: Field 'codPais' doesn't have a default value

a aplicação tem três Entidades: Filhos N : 1 Pais N : 1 Endereco

O ManagedBean de Filhos(que levanta a exceção) está assim:

@ManagedBean
public class FilhosBean {

	private Filhos filhos = new Filhos();

	private Integer codigoPais; 

	private List<Filhos> listaFilhos;

	public void adiciona() {
		EntityManager manager = this.getManager();
		PaisRepositorio paisRepositorio = new PaisRepositorio(manager);
		FilhosRepositorio filhosRepositorio = new FilhosRepositorio(manager);

		if (this.codigoPais != null) {
			Pais pai = paisRepositorio.procura(this.codigoPais);
			this.filhos.setPais(pai);
		}
		if (this.filhos.getCodFilho() == null) {
			filhosRepositorio.adiciona(filhos);
		} else {
			filhosRepositorio.atualiza(filhos);
		}
		this.filhos = new Filhos();
		this.listaFilhos = null;
	}

	public void preparaAlteracao() {
		Map<String, String> params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();
		Integer id = Integer.parseInt(params.get("id"));
		EntityManager manager = this.getManager();
		FilhosRepositorio repository = new FilhosRepositorio(manager);
		this.filhos = repository.procura(id);
	}

	public void remove() {
		Map<String, String> params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();
		Integer id = Integer.parseInt(params.get("id"));
		EntityManager manager = this.getManager();
		FilhosRepositorio repository = new FilhosRepositorio(manager);
		repository.remove(id);
		this.listaFilhos = null;
	}

	private EntityManager getManager() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		return (EntityManager) request.getAttribute("EntityManager");
	}

	public Filhos getFilhos() {
		return filhos;
	}

	public void setFilhos(Filhos filho) {
		this.filhos = filho;
	}

	public Integer getCodigoPais() {
		return codPais;
	}

	public void setCodigoPais(Integer codPais) {
		this.codPais = codPais;
	}

	public List<Filhos> getListaFilhos() {
		if (this.listaFilhos == null) {
			EntityManager manager = this.getManager();
			FilhosRepositorio repository = new FilhosRepositorio(manager);
			this.listaFilhos = repository.getLista();
		}
		return this.listaFilhos;
	}

	public void setListaFilhos(List<Filhos> filhos) {
		this.listaFilhos = filhos;
	}	

}

A tela de cadastro:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
	xmlns:ui=" http://java.sun.com/jsf/facelets" 
	xmlns:h=" http://java.sun.com/jsf/html" 
	xmlns:f=" http://java.sun.com/jsf/core">

	<h:inputHidden value="#{filhosBean.filhos.codFilho}"/>
	<h:panelGrid columns="3">
		<h:outputLabel value="Nome do Aluno:" for="nomeFilho"/>
		<h:inputText id="nomeFilho" required="true"
			requiredMessage="O nome do aluno e obrigatorio"
			value="#{filhosBean.filhos.nomeAluno}">
		</h:inputText>
		<h:message for="nomeFilho"/>

		<h:outputLabel value="Numero Matricula: " for="matricula"/>
		<h:inputText id="matricula" required="true"
			requiredMessage="O numero da Matricula e obrigatoria"
			value="#{filhosBean.filhos.numMatricula}">
		</h:inputText>
		<h:message for="matricula"/>

		<h:outputLabel value="Data de Nascimento:"
			for="nascimentoFilho"/>
		<h:inputText id="nascimentoFilho" required="true"
			requiredMessage=" Informe a data de nascimento do aluno"
			value="#{filhosBean.filhos.dataNascimento.time}">
			<f:convertDateTime pattern="dd/MM/yyyy"/>
		</h:inputText>
		<h:message for="nascimentoFilho"/>

		<h:outputLabel value="Pais:" for="pais"/>
		<h:selectOneMenu id="pais"
			value="#{filhosBean.codPais}">
			<f:selectItems value="#{paisBean.pais}" var="pais"
				itemLabel="#{pais.nomePai}" itemValue="#{pais.codPais}"/>
				
		</h:selectOneMenu>
		<h:message for="pais"/>
		
		<h:commandButton value =" Salva " action ="#{filhosBean.adiciona()}"/>
		 
		<h:commandButton value="Cadastrar" styleClass="botao-formulario">
			<f:ajax event="click" execute="@form"
				listener="#{filhosBean.adiciona}" render="@form"/>
		</h:commandButton>
		
	</h:panelGrid>
</ui:composition>

Repositório:

    public class FilhosRepositorio implements IRepositorio<Filhos>{
	
	private EntityManager manager;

	public FilhosRepositorio(EntityManager manager) {
		this.manager = manager;
	}
	@Override
	public void adiciona(Filhos filho){
		this.manager.persist(filho);
	}
	@Override
	public void remove(Integer id){
		Filhos filho = this.procura(id);
		this.manager.remove(filho);
	}
	@Override
	public Filhos atualiza(Filhos filho){
		return this.manager.merge(filho);
	}
	@Override
	public Filhos procura(Integer id){
		return this.manager.find(Filhos.class,id);
	}
	@Override
	public List<Filhos> getLista(){
		Query query = this.manager.createQuery("SELECT x FROM filhos x");
		return query.getResultList();
	}
	

}

Terias como postar a sua entidade Pais?

Não sei se você viu e também não sei se é isso, mas em um o listener está listener="#{enderecoBean.adiciona}" e no outro listener="#{filhosBean.adicionab[/b]}"

Alguém pode ajudar?

Pessoal eu estava postando aqui problemas de outro post que já foi resolvido!

respostas que não fazem parte do post foram editadas com …

Na tela de cadastro de Pais tem um CheckBox com uma Lista de Endereços (bairro):

<h:outputLabel value="Endereco:" for="endereco" />
		<h:selectOneMenu id="endereco" value="#{paisBean.codigoEndereco}">
			<f:selectItems value="#{enderecoBean.listaEndereco}" var="endereco"
				itemLabel="#{endereco.bairro}" itemValue="#{endereco.codEndereco}" />
</h:selectOneMenu>

a exceção lançada pelo hibernate vem do mysql:

java.sql.SQLException: Field 'codPais' doesn't have a default value

codPais é chave primária da Entidade Pais

@Entity
public class Pais implements Serializable{	
	
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private Integer codPais;
	private String nomePai;
	private String nomeMae;
	private String telefone;
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinColumn
	private Endereco endereco;
	
	@OneToMany(mappedBy="pais", cascade = CascadeType.ALL)
	private List<Filhos> filhos;
	
	public Integer getCodPais() {
		return codPais;
	}
	public void setCodPais(Integer codPais) {
		this.codPais = codPais;
	}
	public String getNomePai() {
		return nomePai;
	}
	public void setNomePai(String nomePai) {
		this.nomePai = nomePai;
	}
	public String getNomeMae() {
		return nomeMae;
	}
	public void setNomeMae(String nomeMae) {
		this.nomeMae = nomeMae;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	public List<Filhos> getFilhos() {
		return filhos;
	}
	public void setFilhos(List<Filhos> filhos) {
		this.filhos = filhos;
	}

Olá!
Na linha 06 vc tem: private Integer codigoPais;

Nas linhas 62 e 63 vc tem

   public Integer getCodigoPais() {  
        return codPais;  
    }  

de onde vc tirou o codPais? acredito que se vc colocar return this.codigoPais, o problema será resolvido

Não esqueça de por [RESOLVIDO]

Foi uma falha minha na postagem do código.

É o seguinte:

codPais é um atributo Identificador da classe Pais(e era para ser chave estrangeira na Classe Filhos)
Eu tinha criado um atributo codPais do tipo Integer no ManagedBean FilhosBean.
Quando surgiu o erro fiquei na dúvida de qual o codPais estava levantado a exceção: codPais de Pais ou codPais do ManagedBean FilhosBean.
Para não ter dúvidas eu renomeei codPais do ManagedBean FilhosBean para codigoPais.
A Classe FilhosBean postada acima era anterior a alteração e ao ser editada esqueci de renomear na implementação dos métodos mas no meu códigos já correta!

Agora a Solução:

Ao criar o banco de dados e as tabelas no Mysql WorkBench Eu criei as chaves estrangeiras na mão, mas mesmo assim o WorkBench ou o mySql criava chaves estrangeiras automaticamente!

eu criei:
codPais como chave estrangeira na tabela Filhos e o MySql criou automaticamente pais_codPais, Eu deletava esta chave e o banco recriava novamente! e o Hibernate referenciava a ela como chave estrangeira!

Então o que que eu fiz:

Na classe Filhos Explicitei quem seria a chave estrangeira!

Filhos.java

Antes:

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn
private Pais pais;

Depois:

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "codPais")
private Pais pais;

Ou Seja: codPais que levantava a exceção era o campo da Tabela Filhos que ficava nula. Porque não era reconhecida pelo Hibernate como chave estrangeira. Mas na Tabela do banco está como NOT NULL

E não codPais renomeada para codigoPais do ManagedBean FilhosBean.