JSF grava valor 0 para Integer em vez de null

Oi gente tudo bem,

tenho uma aplicação que utilizo JSF 2 e hibernate, ele funciona normalmente porém tem uma coisa que me intriga e agora começou a me causar problemas,

Quando gravo um campo String sem valor no banco de dados e recupero ele, ele volta do jeito que gravei, ou seja, em branco(deve vir um “”), porém quando faço isso com um Integer, passo um valor em branco, quando mando ele recuperar o valor gravado vejo que ele me traz o valor ‘0’ de volta, alguém sabe pq isso acontece? e tem como manda ele gravar null em vez de ‘0’?

umas das minhas classes modelo Cidade.java

@Entity
public class Cidade implements Serializable {

@Id
    @SequenceGenerator(name="generator_cidade",sequenceName="sequence_cidade")
    @GeneratedValue(generator="generator_cidade")
    private Integer cid_id;
    
    @ManyToOne
    @ForeignKey(name="cidade_fkey_estado_01")
    @JoinColumn(name="est_id")
    private Estado estado;
 
    @Column(length=100)
    private String cid_nom;

//setters e getters
}

Sei que a pergunta é estúpida, mas… a tua tabela no banco não tá com valor 0 como default?
A mesma coisa com tua String… “branco” não é null. São coisas diferentes.
Pega o script de criação dessa tabela e posta aqui, se precisar.
Abraço!

Tenho vários projetos com a mesma estrutura e todos trazem o resultado correto.
Em algum lugar você deve estar setando valor 0 ao inteiro.

Agora que percebi, a culpa não é do JSF, pois tentei gravar um dado no banco de dados usando um aplicativo desktop que usa hibernate e ele fez a mesma coisa

Sinceramente, não sei dizer se minha tabela tem 0 como default, pois eu uso o próprio hibernate para criar o banco de dados, nem sabia que tinha como colocar 0 ou outro numero qualquer como default.

Onde posso verificar o valor default do banco?

O hibernate pode estar gerando este valor default?

ps: não sei se isso tem a ver, mas ja utilizei meu programa com 2 bancos de dados diferentes, MySQL e Postgre, e nos dois havia este mesmo comportamento

minha classe modelo no hibernate

@Entity
@Table(name="pessoas")
public class Pessoa implements Serializable
{
    @Id
    @SequenceGenerator(name="generator_pessoa",sequenceName="sequence_pessoa")
    @GeneratedValue(generator="generator_pessoa")
    @Column(name="idPessoa")
    private Integer id;
    @Column(name="nome_pessoa",length=40, nullable=false)
    private String nome;
    @Column
    private String fone;
    @Column
    private String cidade;
    @Column(name="valor_salario", precision=2)
    private double salario;
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;

sql gerado pelo hibernate

    drop table pessoas

    drop sequence sequence_pessoa

    create table pessoas (
        idPessoa int4 not null,
        cidade varchar(255),
        dataCadastro timestamp,
        dataNascimento date,
        fone varchar(255),
        nome_pessoa varchar(40) not null,
        valor_salario float8,
        primary key (idPessoa)
    )

    create sequence sequence_pessoa

Não, a não ser que você especificasse no @Column.
Tenho quase certeza que é no managedBean.

Vai lá no teu gerenciador do banco de dados e verifica o descriptor da tua tabela. Existe uma boa possibilidade de ter esse valor default no banco.
Talvez o Hibernate crie esse valor default se o campo for nullable = false, mas eu não deixo o Hibernate se meter no banco nunca… faço na mão e mapeio as classes.
Banco é banco, o Hibernate pra mim só mapeia… não confio num sistema que inventa de brincar de DBA comigo

[quote=fabiobh]
sql gerado pelo hibernate

[code]
drop table pessoas

drop sequence sequence_pessoa

create table pessoas (
    idPessoa int4 not null,
    cidade varchar(255),
    dataCadastro timestamp,
    dataNascimento date,
    fone varchar(255),
    nome_pessoa varchar(40) not null,
    valor_salario float8,
    primary key (idPessoa)
)

create sequence sequence_pessoa

[/code][/quote]

[quote]Não, a não ser que você especificasse no @Column.
Tenho quase certeza que é no managedBean[/quote]

Como o drsmachado havia dito parece que meu erro é no managedBean mesmo, pois verifiquei agora pelo PhpMyAdmin que meu banco de dados MySQL está sendo criado corretamente, com os campos com valor default de null,

primeiramente meu managedBean pra persistir informações no banco é grande , mas é bem simples, coloquei ele mais embaixo junto com a classe modelo que é utilizada pelo hibernate(a classe que eu coloquei anteriormente era apenas um exemplo simples que eu tinha montado na hora)

Eu fiz um teste no meu managedBean e simplesmente comentei um dos atributos

so pra ver se o dado ia ser gravado com null, e ele foi, tem alguma coisa que to fazendo nesse manageBean que ta dando essse problema, alguém tem ideia do q pode ser?

ManagedBean

@ManagedBean
public class GravaPessoas implements CRUD{

    private Integer pes_id;
    private Integer cid_id;
    private Integer est_id;
    private String pes_prenome;
    private String pes_nome_meio;
    private String pes_sobrenome;
    private String pes_nome_pais_origem;
    private Date pes_data_nascimento;
    private String pes_rg_num;
    private Date pes_rg_dat;
    private String pes_rg_expedidor;
    private Long pes_cpf;
    private Long pes_telefone1;
    private Long pes_telefone2;
    private Long pes_telefone3;
    private String pes_email_pessoal;
    private Long pes_cep;
    private String pes_logradouro;
    private String pes_bairro;
    private Long pes_numero;
    private String pes_complemento;
    private String pes_nom_completo;
    private Session sessao = CriadorDeSessaoNovo.getSession();
    private Transaction tx = sessao.beginTransaction();

   
    public void gravar() {
        try {
            Estado obj_estado = new Estado();
            obj_estado.setEst_id(est_id);

            Cidade obj_cidade = new Cidade();
            obj_cidade.setCid_id(getCid_id());

            Pessoas obj_pes = new Pessoas();

            if (getPes_id() != 0) {
                obj_pes.setPes_id(pes_id);
            }

            obj_pes.setPes_bairro(WordUtils.capitalizeFully(pes_bairro));
            obj_pes.setPes_cep(pes_cep);
            obj_pes.setPes_complemento(WordUtils.capitalizeFully(pes_complemento));
            obj_pes.setPes_cpf(pes_cpf);
            obj_pes.setPes_data_nascimento(pes_data_nascimento);
            obj_pes.setPes_email_pessoal(pes_email_pessoal);
            obj_pes.setPes_logradouro(WordUtils.capitalizeFully(pes_logradouro));
            obj_pes.setPes_nom_completo(WordUtils.capitalizeFully(pes_prenome + " " + pes_nome_meio + " " + pes_sobrenome));
            obj_pes.setPes_nome_meio(WordUtils.capitalizeFully(pes_nome_meio));
            obj_pes.setPes_nome_pais_origem(WordUtils.capitalizeFully(pes_nome_pais_origem));
            obj_pes.setPes_numero(pes_numero);
            obj_pes.setPes_prenome(WordUtils.capitalizeFully(pes_prenome));
            obj_pes.setPes_rg_dat(pes_rg_dat);
            obj_pes.setPes_rg_expedidor(WordUtils.capitalizeFully(pes_rg_expedidor));
            obj_pes.setPes_rg_num(pes_rg_num);
            obj_pes.setPes_sobrenome(WordUtils.capitalizeFully(pes_sobrenome));
            //obj_pes.setPes_telefone1(pes_telefone1);
            obj_pes.setPes_telefone2(pes_telefone2);
            obj_pes.setPes_telefone3(pes_telefone3);

            obj_pes.setEstado(obj_estado);
            obj_pes.setCidade(obj_cidade);

            sessao.saveOrUpdate(obj_pes);
            tx.commit();
            sessao.close();

            FacesContext.getCurrentInstance().addMessage("FormPessoas:gravar", new FacesMessage("Informações gravadas com sucesso!"));

        } catch (Exception erro) {
            System.out.println("Erro na insersão : " + erro);
            tx.rollback();
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormPessoas:gravar", new FacesMessage("Falha ao gravar informações!"));

        }
    }

    public void excluir() {
        try {
            Pessoas obj_pes = new Pessoas();
            if (getPes_id() != 0) {
                obj_pes.setPes_id(pes_id);
            }

            sessao.delete(obj_pes);
            tx.commit();
            sessao.close();

            FacesContext.getCurrentInstance().addMessage("FormPessoas:excluir", new FacesMessage("Informações excluídas com sucesso!"));

        } catch (Exception erro) {
            System.out.println("Erro na insersão : " + erro);
            tx.rollback();
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormPessoas:excluir", new FacesMessage("Falha ao excluir informações!"));
        }
    }
//setters e getters
}

Classe Pessoa(a verdadeira, a primeira era so exemplo de teste)

@Entity
public class Pessoas implements Serializable {

    @Id
    @SequenceGenerator(name="generator_pessoa",sequenceName="sequence_pessoa")
    @GeneratedValue(generator="generator_pessoa")
    private Integer pes_id;

    @ManyToOne
    //@ForeignKey(name="nomeTabela_fkey_nomeAtributo_01")
    @ForeignKey(name="pessoa_fkey_cidade_01")
    //@JoinColumn(name="baseadoNoAtributo")
    @JoinColumn(name="cid_id")
    private Cidade cidade;

    @ManyToOne
    @ForeignKey(name="pessoa_fkey_estado_01")
    @JoinColumn(name="est_id")
    private Estado estado;
        
    @Column(length=100)
    private String pes_prenome;

    @Column(length=100)
    private String pes_nome_meio;

    @Column(length=100)
    private String pes_sobrenome;

    @Column(length=100)
    private String pes_nome_pais_origem;

    @Column
    @Temporal(TemporalType.DATE)
    private Date pes_data_nascimento;

    @Column(length=100)
    private String pes_rg_num;

    @Column
    @Temporal(TemporalType.DATE)
    private Date pes_rg_dat;

    @Column(length=100)
    private String pes_rg_expedidor;

    @Column(length=100)
    private Long pes_cpf;

    @Column(length=100)
    private Long pes_telefone1;

    @Column(length=100)
    private Long pes_telefone2;

    @Column(length=100)
    private Long pes_telefone3;

    @Column
    private String pes_email_pessoal;

    @Column(length=100)
    private Long pes_cep;

    @Column(length=100)
    private String pes_logradouro;

    @Column(length=100)
    private String pes_bairro;

    @Column(length=100)
    private Long pes_numero;

    @Column(length=100)
    private String pes_complemento;

    @Column(length=100)
    private String pes_nom_completo;

Falei no banco, nao o gerado pelo Hibernate. Sabe-se la o default do sgbd que o cara ta usando…

Mas eu verifiquei no descritor do meu banco MySQL mesmo, e os valores default estão como null mesmo, tanto os Integers como, as Strings.

Em algum lugar por onde essa valor passa existe um int ou algum outro tipo primitivo?