powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate mapping и БД
8 сообщений из 8, страница 1 из 1
Hibernate mapping и БД
    #33919547
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сижу разбираюсь с Hibernate'oм. Вот такая проблема
Свойство price типа float отображается в БД MySQL 5.0.22 как decimal(10,2)
Код: plaintext
1.
2.
3.
4.
5.
6.
   
...     
<property name="price" type="float" >
     <column name="price" sql-type="numeric(10,2)"/>
</property>
...
при записи вылетает эксепшн
Код: plaintext
1.
2.
3.
org.hibernate.exception.GenericJDBCException: could not insert: [somepackage.Goods]
...
Data truncation: Data truncated  for  column 'price' at row  1 
Вобщем хотелось сделать свойство "цена" (10,2). Подскажите как решить эту проблему или дайте ссылку где почитать.
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33920349
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте проще:
Код: plaintext
<property name="price" column="price" type="float"/>

Должно работать. Hibernate сам производит преобразования sql типов в типы данных java и обратно как надо. Не надо ему помогать в этом, тем более, когда это приводит к ошибкам.

Прочитать достаточно главу "Basic O/R Mapping" из документации по Hibenrate, там достаточно информации, чтобы сделать то, что Вы хотите.

Если не заработает, выкладывайте схему вашей таблицы, класс и маппинг.
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33920591
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДолжно работать. Hibernate сам производит преобразования sql типов в типы данных java и обратно как надо. Не надо ему помогать в этом, тем более, когда это приводит к ошибкам.
Мне ненужна куча цифр после запятой.
авторПрочитать достаточно главу "Basic O/R Mapping" из документации по Hibenrate, там достаточно информации, чтобы сделать то, что Вы хотите.Читал уже, sql-type="numeric(10,2)" оттуда.
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33920708
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясно, давайте разбираться вместе. Вот такой пример я сделал, он работает:

1) таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
# Host: localhost
# Database: test
# Table: 'test2'
# 
CREATE TABLE `test2` (
  `id`  int ( 11 ) NOT  NULL  auto_increment,
  `price` decimal( 10 , 2 ) NOT  NULL   default  '0.00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT  CHARSET=latin1; 

2) класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 package  somepackage;

 public   class  Good {
     private   int  id;
     private   float  price;

     public   int  getId() {
         return  id;
    }

     public   void  setId( int  id) {
         this .id = id;
    }

     public   float  getPrice() {
         return  price;
    }

     public   void  setPrice( float  price) {
         this .price = price;
    }
}
3) маппинг:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping  PUBLIC  "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping  package ="somepackage">
    < class  name="Good" lazy="false" optimistic-lock="none" table="test2">
        <id column="id" type="int" name="id">
            <generator  class ="native"/>
        </id>
        <property name="price" type="float">
            <column name="price" sql-type="numeric(10,2)"/>
        </property>
    </ class >
</hibernate-mapping>
4) тест собственно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 import  org.hibernate.SessionFactory;
 import  org.hibernate.Transaction;
 import  org.hibernate.cfg.Configuration;
 import  org.hibernate.classic.Session;
 import  somepackage.Good;

 public   class  Test4 {
     public   static   void  main(String[] args) {
        Configuration configuration =  new  Configuration();
        configuration.configure();
        configuration.addClass(Good. class );

        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();

        Transaction tx = session.beginTransaction();
         try  {

            Good good =  new  Good();
            good.setPrice( 10 .26f);

            session.save(good);
            tx.commit();
        }  catch  (Exception e) {
            tx.rollback();
        }

        session.close();
    }
}
У меня записи вставляются:
+----+-------+
| id | price |
+----+-------+
| 1 | 5.10 |
| 2 | 10.20 |
| 3 | 10.25 |
| 4 | 10.26 |
+----+-------+

Теперь самое интересное - тестирую в такой конфигурации: Hibernate 3.0, MySql 4.1., JDK 1.5.0. Можете проверить, заработает ли у Вас (в Вашей конфигурации)?
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33920722
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще конфигурация (на всякий пожарный):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
     PUBLIC  "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="show_sql">false</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="cglib.use_reflection_optimizer">true</property>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property>

        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.connection.pool_size"> 4 </property>
        <property name="hibernate.statement_cache.size"> 0 </property>

        <property name="hibernate.c3p0.max_size"> 5 </property>
        <property name="hibernate.c3p0.min_size"> 0 </property>
        <property name="hibernate.c3p0.timeout"> 120 </property>
        <property name="hibernate.c3p0.max_statements"> 100 </property>
        <property name="hibernate.c3p0.idle_test_period"> 0 </property>
        <property name="hibernate.c3p0.acquire_increment"> 2 </property>

        <property name="hibernate.jdbc.batch_size"> 20 </property>
        <property name="hibernate.cache.use_second_level_cache">false</property>
        <property name="hibernate.cache.use_query_cache">true</property>
    </session-factory>
</hibernate-configuration>
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33922333
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо pretender.
Короче вот что получмлось, у меня все примерно так же как и pretender написал. Но один фиг работает как-то странно.
автор Goods goods=new Goods();
goods.setName("name_1");
goods.setPrice(1234.22f);

Goods goods2 = new Goods();
goods2.setName("name_2");
goods2.setPrice(3452f);

Transaction t = session.beginTransaction();
try{

session.saveOrUpdate(goods);
session.saveOrUpdate(goods2);

t.commit();
}
catch(HibernateException hex){
t.rollback();
}
после этого кода вылетает эксепшн, записывается только первый объект. Полазил по инету, сменил драйвер на mysql-connector-java-3.0.17-ga. Пишется и первый и второй объект.
Еще писали, что нужно в парамерах соединения передавать параметр jdbcCompliantTruncation=false, результат он никакого недал.
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33923508
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сейчас тоже полазил. Действительно, похоже, что это баг в mysql драйвере. Ну, по крайней мере, описание очень похоже. Если стэк-трэйс сравнить (в его jdbc-шной части), то думаю, что сомнения полностью отпадут.

Из практики: очень часто было, что натыкались на какую-то проблему в Hibernate, долго матерились, потом выяснялось, сто баг в mysql коннекторе, меняли его на более новый, проблема решалась сама собой и сильно хвалили Hibernate потом. Возможно, это тот самый случай.
...
Рейтинг: 0 / 0
Hibernate mapping и БД
    #33923658
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно.
Еще нашел инфу про этот баг, говорят что он появляется только на машинах с WinXP, к сожалению пока немогу попробовать этот код на др. операционке.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate mapping и БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]