Bom Galera, estou tendo um problema ao efetuar uma inserção no BD, me retorna uma Exception dizendo que o campo esta “null” porém esse campo é o ID ( @Id @GeneratedValue ) estou usando JSF.
Como é o proprio banco quem ira passar seu valor pq acontece isso ?
Obrigado !
bom dia diego…
vai ai algumas verificacoes:
Voce criou o get/set desse atributo?
Esse atributo eh do tipo Long?
Ele realmente existe na tabela como auto increment
no @GeneratedValue qual o tipo de GenerationType vc esta usando?
se puder postar o codigo, poderemos avaliar melhor…
abracos
Já me aconteceu isso quando criei a table com GenerationType auto e depois alterei para identity com a tabela ainda existindo. Tive que apagar a table e deixar o sistema criar novamente.
Se você criou a base na mão pode ser porque não setou sua table como auto incremento.
eu tive uma vez esse mesmo problema, tinha esquecido de por auto increment na criação da tabela…
mas ficaria mais fácil de analisar se você colocasse o código 
Sim Criei todos os gets/sets
Sim é do tipo Long
Bem, é para ele estar como auto increment pois a anotação força a isso…
Não estou usando nenhum tipo de strategy …
A Entity
package modelo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
@Entity
public class Plano {
@Id @GeneratedValue
private Long id;
@NotNull
private String nome;
@NotNull
private String descricao;
@NotNull
private int dias;
/**********************************************************/
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public int getDias(){
return dias;
}
public void setDias(int dias ){
this.dias =dias;
}
}
ManagedBean
package managedbeans;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import repositorios.PlanoRepository;
import modelo.Plano;
@SessionScoped
@ManagedBean
public class PlanoBean {
@ManagedProperty(value = "#{entityMangager}")
private EntityManager entityManager;
private Plano Plano = new Plano();
private List<Plano> Planos;
/**************************/
public List<Plano> getPlanos(){
if(this.Planos == null){
System.out.println("CHAMANDO O REPOSITORIO");
PlanoRepository repository = new PlanoRepository(this.entityManager);
this.Planos = repository.getPlanos();
}
return this.Planos;
}
/***********************************/
public void adiciona(){
PlanoRepository planoRepository = new PlanoRepository(this.entityManager);
planoRepository.adiciona(this.Plano);
this.Plano = new Plano();
this.Planos = null;
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public Plano getPlano() {
return Plano;
}
public void setPlano(Plano plano) {
Plano = plano;
}
public void setPlanos(List<Plano> planos) {
Planos = planos;
}
}
JSF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 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"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:composition template="/tamplates/tamplate.xhtml">
<ui:define name="conteudo">
<h:form styleClass="formulario">
<p:panel header="Planos" style="margin-left:14%; width:60%;">
<h:panelGrid columns="4" style="text-align: right;">
<!--********** NOME DO PLANO ***********-->
<h:outputText value="Nome:" for="plano-nome" />
<h:inputText
id="plano-nome"
required="true"
value="#{planoBean.plano.nome}"/>
<h:message for="plano-nome" styleClass="mensagem-erro"/>
<!--********** DESCRIÇÃO DO PLANO ***********-->
<h:outputText value="Descrição: " for="plano-descricao"/>
<h:inputTextarea
id="plano-descricao"
required="true"
value="#{planoBean.plano.descricao}"
rows="4" cols="16"/>
<h:message for="plano-descricao" styleClass="mensagem-erro"/>
<!--********** DIAS DO PLANO ***********-->
<h:outputText value="Dias: " for="plano-dias" />
<h:inputText
id="plano-dias"
required="true"
value="#{planoBean.plano.dias}"/>
<h:message for="plano-dias" styleClass="mensagem-erro"/>
<!--********** INSERE ***********-->
<h:commandButton value="Cadastrar" styleClass="botao-formulario">
<f:ajax
event="click"
execute="@form"
listener="#{planoBean.adiciona}"
render="@form"/>
</h:commandButton>
</h:panelGrid>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
</html>
Se você não setar strategy é gerada a padrão que é @GeneratedValue(strategy = GenerationType.AUTO). Mas se não mudou durante o uso então não deve ser o problema.
Você tem um erro na escrita aqui: @ManagedProperty(value = “#{entityMangager}”)
vc disse: [quote]Bem, é para ele estar como auto increment pois a anotação força a isso… [/quote]
e na base? o campo id na base esta configurado como auto increment??
acredito que tenha q estar tbem…
faz um teste ai…
Verdade Edu, esta realmente com a anotação errada, bem corrigir ela e testar novamente …
Denislima, eu nem acesso o banco manualmente, mas irei verificar isso.
Obrigado.
Resolvi da seguinte forma:
Corrigi a anotação, exclui e criei uma nova base e fiz as anotações que me sugeriram …
Vlw Galera