Hibernate não salva as casas decimais de float

14 respostas
G

Olá pessoal estou usando o hibernate e agora verifiquei que o Hibernate não está salvando as casa decimais dos valores de float.
Alguem saberia dizer o por que?

14 Respostas

A

Posta o código da sua classe

G

Seria bom você passar o fonte de sua classe e seu mapeamento para vermos como está.

Uma dica, se você utiliza esses valores pra fazer cálculo (soma, subtração, …) é melhor utilizar BigDecimal, já tive um monte de problema com float e double.

G
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo;

/**
 *
 * @author Germano
 */
public class SalarioMinimo {
    int ano;
    float valor;

    public void setAno(int ano){
    this.ano =ano;
    }
    public void setValor(float valor){
    this.valor = valor;
    }
    public int getAno(){
    return this.ano;
    }
    public float getValor(){
    return this.valor;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Document   : SalarioMinimo.hbm.xml
    Author     : Germano Rodrigo Paiva de Assis
    E-mail     : [email removido]
    Description:
        Purpose of the document follows.
-->
<hibernate-mapping>
  <class name="modelo.SalarioMinimo" table="SalarioMinimo">
    <id column="ano" name="ano">
    </id>
    <property column="valor" name="valor"/>
  </class>
</hibernate-mapping>
P

olá amigo,

Segundo sua necessidade, recomendo que vc use a classe Wraper BigDecimal pois é a melhor recomendada para valores monatários pois nao é de ponto flutuante e sim ponto fixo sem arredondamentos.

Experimente e poste os resultados

Abraço

G

paulo1911:
olá amigo,

Segundo sua necessidade, recomendo que vc use a classe Wraper BigDecimal pois é a melhor recomendada para valores monatários pois nao é de ponto flutuante e sim ponto fixo sem arredondamentos.

Experimente e poste os resultados

Abraço


Poutz
É que eu tenho outras classes mapeadas que usam também float.
Num saberias me dizer qual a onda que está dando para que a parte decimal não esteja sendo inserida no banco?
Ou vou ter de editar todas as outras classes ? xD

Grato

G

Tirando a parte que falamos sobre o BigDecimal, parece que está tudo ok no seu código.
Só pra desencargo de consciência, você pode passar qual é o tipo desse campo no banco?
Mais uma coisa, evite usar tipos primitivos, use objetos, afinal você está trabalhando com uma linguagem orientada a objetos. Ao invés de float, use Float.

A

tente isso

hbm

<property name="balance" type="float"> <column name="balance" sql-type="decimal(12,3)"/> </property>

anotação

veja se a coluna no banco esta definida para trabalhar com casas decimais

G

[quote=AAAquino]tente isso

hbm

<property name="balance" type="float"> <column name="balance" sql-type="decimal(12,3)"/> </property>

esse hbm é o hbm da classe ou o de configuração?
Se for o da classe, tem algum modo de fazer isso no hibernate.cfg.xml ?

Em comando sql direto eu consegui inserir no banco.
e as colunas float no banco estão tamanho 22 precisão 126 escala -

A

[quote=germanosk]

AAAquino:
tente isso

hbm

<property name="balance" type="float"> <column name="balance" sql-type="decimal(12,3)"/> </property>

esse hbm é o hbm da classe ou o de configuração?
Se for o da classe, tem algum modo de fazer isso no hibernate.cfg.xml ?

Em comando sql direto eu consegui inserir no banco.
e as colunas float no banco estão tamanho 22 precisão 126 escala -

estes dados vc coloca no SalarioMinimo.hbm.xml

G

Cara eu coloquei, editei, reditei sempre limpando o projeto
mas nada até agora.
Estou até tentando configurar o log4j para ver como o hibernate está passando isso nos values pq tá cruel :frowning: se alguem puder ajudar ai agradeço muito

G
Parte do log
Hibernate: insert into JurosTJLP (valor, ano) values (?, ?)
17:59:45,657 DEBUG AbstractBatcher:44 - Executing batch size: 1
17:59:45,659 DEBUG Expectations:53 - success of batch update unknown: 0
17:59:45,659 DEBUG AbstractBatcher:374 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
17:59:45,659 DEBUG JDBCTransaction:103 - commit
17:59:45,660 DEBUG AbstractFlushingEventListener:111 - processing flush-time cascades
17:59:45,660 DEBUG AbstractFlushingEventListener:154 - dirty checking collections
17:59:45,660 DEBUG AbstractFlushingEventListener:85 - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
17:59:45,660 DEBUG AbstractFlushingEventListener:91 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
17:59:45,660 DEBUG Printer:83 - listing entities:
17:59:45,660 DEBUG Printer:90 - modelo.JurosTJLP{valor=4.567, ano=2134}
versao atual do JurosTJLP.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Document   : JurosTJLP.hbm.xml
    Author     : Germano Rodrigo Paiva de Assis
    E-mail     : [email removido]
    Description:
        Purpose of the document follows.
-->
<hibernate-mapping>
  <class name="modelo.JurosTJLP" table="JurosTJLP">
    <id column="ano" name="ano">
    </id>
    <property  name="valor" type="float" >
        <column name="valor" sql-type="decimal(126,2)"/>
    </property>

  </class>
</hibernate-mapping>
Versao atual do modelo.JurosTJLP.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo;

/**
 *
 * @author Germano
 */
public class JurosTJLP {
    int ano;
    Float valor;

    public void setAno(int ano){
    this.ano =ano;
    }
    public void setValor(Float valor){
    this.valor = valor;
    }
    public int getAno(){
    return this.ano;
    }
    public float getValor(){
    return this.valor;
    }
}
e eu consegui inserir no BD usando a query
insert into jurostjlp (ano,valor) values('2010','123,456')

Eu sinceramente não sei o que fazer para que o hibernate salve corretamente no banco se alguém souber favor ajudar
agradeço desde já

A

dá um ‘desc’ na sua tabela ‘jurostjlp’ e posta aqui

G

o create da tabela

CREATE TABLE "JUROSTJLP" ( "ANO" NUMBER(10,0) NOT NULL ENABLE, "VALOR" FLOAT(126), PRIMARY KEY ("ANO") ENABLE ) /
Alguem saberia dizer se é alguma frescura/ configuração do Hibernate com o Oracle que está causando isso.
Já procurei já li mas até agora não consegui resolver

G

Olá pessoal

Eu editei meu model
de float para Double e o hibernate inseriu sem problemas com as casas depois da virgula e tudinho.
Acho que vou editar todos os models de float para Double.
Por enquanto deve resolver meu problema, mas gostaria de saber se a longo prazo pode dar algum problema.
Grato pelas respostas e pela ajuda abraço a todos :smiley:

Criado 16 de novembro de 2010
Ultima resposta 18 de nov. de 2010
Respostas 14
Participantes 4