Спящий режим, сохраняющий большой десятичный
У меня есть код гибернации, который вставляет Bigdecimal число в столбец Db типа FLOAT. Это работает в целом. Однако, когда я пытаюсь вставить значение 0.00000000009080767 и снова извлечь объект, я вижу, что возвращаемое значение отличается.
Однако, когда я пытаюсь вставить значение с помощью SQL-запроса напрямую, а затем извлечь его с помощью метода загрузки hibernate, я вижу, что SOP метода getAmount выводит значение правильно.
Код:
Contact contact1 = new Contact("sailesh1117777", "unknown@gmail.com", "Vietnam1", "0904277091",new BigDecimal("0.00000000009080767"));
session.persist(contact1);
session.getTransaction().commit();
session.flush();
session.close();
session = sessionFactory.openSession();
Contact contact5 = (Contact) session.load(Contact.class, new Integer(1));
System.out.println(((BigDecimal)contact5.getAmount()).toPlainString());
<class name="Contact" table="CONTACT">
<id name="id" column="CONTACT_ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME"/>
<property name="email"/>
<property name="address"/>
<property name="telephone"/>
<property name="amount" type="big_decimal"/>
</class>
ВЫХОД: 0.00000000008978076
2 ответа
Когда hibernate сохраняет объект в базе данных, он вызывает его метод toString, чтобы получить значение и сохранить его. Когда я глубоко осмотрел объект BigDecimal, я узнал, что метод toString возвращает экспоненциальное значение, и, следовательно, значение попадает в БД с другим значением. Для этого я написал пользовательский класс, расширяющий BigDecimal и переопределяющий метод toString, который внутренне будет вызывать метод toPlanString для BigDecimal и помогает преодолеть, экспоненциальное значение, которое будет вставлено, будет другим значением.
Измените сумму столбца вашей таблицы. Контакт с типом данных NUMBER(19,2)
, подобно
ALTER TABLE person
ALTER COLUMN amount NUMBER(19,2)