Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Проблема с датой в Hibernate/MySQL


Автор: Bulat 22.9.2006, 09:04
Что делать если подобная проблема с датой
Цитата

09:44:57,859 ERROR JDBCExceptionReporter:72 - Value '0000-00-00' can not be represented as java.sql.Date
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.doList(Loader.java:1596)
    at org.hibernate.loader.Loader.list(Loader.java:1577)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:844)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
    at MailSender.Database.Test.main(Test.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)
Caused by: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
    at com.mysql.jdbc.ResultSet.getDateFromString(ResultSet.java:1913)
    at com.mysql.jdbc.ResultSet.getDate(ResultSet.java:1849)
    at com.mysql.jdbc.ResultSet.getDate(ResultSet.java:1817)
    at com.mysql.jdbc.ResultSet.getDate(ResultSet.java:1865)
    at org.hibernate.type.DateType.get(DateType.java:25)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:77)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:68)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:80)
    at org.hibernate.persister.entity.BasicEntityPersister.hydrate(BasicEntityPersister.java:1690)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:991)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:942)
    at org.hibernate.loader.Loader.getRow(Loader.java:855)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:305)
    at org.hibernate.loader.Loader.doQuery(Loader.java:412)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
    at org.hibernate.loader.Loader.doList(Loader.java:1593)
    ... 11 more

Автор: tux 22.9.2006, 09:09
Bulat, называй темы так чтобы было понятно о чем это.

У тебя как я понимаю дата в базе хранится в виде строки? Думаю что единственный способ - получить строку и преобразовывать в дату уже после получения. Если нет, то опиши подробности, при которых это происходит.

Автор: batigoal 22.9.2006, 09:30
Цитата(Bulat @  22.9.2006,  10:04 Найти цитируемый пост)
Value '0000-00-00' can not be represented as java.sql.Date

Странный порядок, вообще говоря. Обычно же год в конце идет.

Автор: tux 22.9.2006, 09:36
Цитата(batigoal @  22.9.2006,  14:30 Найти цитируемый пост)
Обычно же год в конце идет. 

Ну это смотря как хранить. В старых форматах DBF если не ошибаюсь в таком виде дата и хранилась, причем как раз строкой. Но, думаю, это не тот случай.

Автор: Bulat 22.9.2006, 09:40
Цитата(tux @  22.9.2006,  09:09 Найти цитируемый пост)
называй темы так чтобы было понятно о чем это.

Ну вообще в JDBC таких проблем не возникало, пока только с hibernate, соответственно и тема smile 

Цитата(tux @  22.9.2006,  09:09 Найти цитируемый пост)
У тебя как я понимаю дата в базе хранится в виде строки?

`contract_date` date default NULL "

Цитата(batigoal @  22.9.2006,  09:30 Найти цитируемый пост)
Странный порядок, вообще говоря. Обычно же год в конце идет. 

.......... smile ............

В принципе можешь вспомнить как я и раньше ругался на базу с которой приходится работать smile 


Цитата(tux @  22.9.2006,  09:09 Найти цитируемый пост)
Если нет, то опиши подробности, при которых это происходит.

Вообще просто хочу достать все данные из одной таблицы
таблица:
Цитата

  `user_id` mediumint(8) unsigned NOT NULL default '0',
  `record_id` smallint(5) unsigned NOT NULL default '0',
  `balance` double NOT NULL default '0',
  `limit` double NOT NULL default '0',
  `description` varchar(128) NOT NULL default '',
  `flag` smallint(5) unsigned NOT NULL default '0',
  `contract` varchar(32) default NULL,
  `contract_date` date default NULL,
  `address` varchar(64) default NULL,
  `gender` char(2) NOT NULL default 'îå',
  `person` varchar(128) NOT NULL default '',
  `charter` varchar(40) NOT NULL default '',
  `post` varchar(64) NOT NULL default '',
  `signature` varchar(64) NOT NULL default '',
  `place_id` tinyint(3) unsigned default '0',
  `operation_date` datetime default NULL,
  `operation_user` varchar(64) default NULL,
  PRIMARY KEY  (`user_id`,`record_id`)


Код

    public static void main(String[] args) throws Exception {
        // запрос
        //String Query = "FROM RecordsData r WHERE r.user_id:=name";
        String Query = "FROM RecordsData";


        // что ищем?
        Integer userId = 28309;
        //String name = args[0];
        String name = userId.toString();
        // инициализация

        Configuration cfg = new Configuration();
        cfg.configure();
        SessionFactory sf = cfg.buildSessionFactory();

        // открываем Session
        Session sess = sf.openSession();

        // поиск, результат в list
        //List recordsList = sess.createQuery(Query).setString("name", name).list();
        List recordsList = sess.createQuery(Query).list();


        if (recordsList.size() == 0) {
            System.exit(0);
        }

        RecordsData r = (RecordsData) recordsList.get(0);

        for (int i=0; i<recordsList.size(); i++) {
            RecordsData rData = (RecordsData) recordsList.get(i);
            System.out.println("Найден электронный почтовый ящик: " + rData.getAddress());
        }

        sess.close();
    }


Может с хибернейтом не совсем верно работаю, практически еще не было возможности его почитать и что-то с ним делать

Автор: tux 22.9.2006, 09:47
Класс RecordsData и маппинг для него еще приведи, здесь вроде бы все нормально. В hibernate.cfg.xml проверь правильный ли диалект там задан - именно для MySQL? Была как-то похожая ошибка из-за неправильного диалекта.

Автор: Bulat 22.9.2006, 09:59
tux, 
Код

public class RecordsData {
    private Integer userId;
    private Integer recordId;
    private Double balance;
    private Double limit;
    private String description;
    private Integer flag;
    private String contract;
    private java.sql.Date contractDate;
    private String address;
    private String gender;
    private String person;
    private String charter;
    private String post;
    private String signature;
    private Integer placeId;
    private java.sql.Date operationDate;
    private String operationUser;

    public RecordsData() {

    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getRecordId() {
        return recordId;
    }

    public void setRecordId(Integer recordId) {
        this.recordId = recordId;
    }

    public Double getBalance() {
        return balance;
    }

    public void setBalance(Double balance) {
        this.balance = balance;
    }

    public Double getLimit() {
        return limit;
    }

    public void setLimit(Double limit) {
        this.limit = limit;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getFlag() {
        return flag;
    }

    public void setFlag(Integer flag) {
        this.flag = flag;
    }

    public String getContract() {
        return contract;
    }

    public void setContract(String contract) {
        this.contract = contract;
    }

    public java.sql.Date getContractDate() {
        return contractDate;
    }

    public void setContractDate(java.sql.Date contractDate) {
        this.contractDate = contractDate;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPerson() {
        return person;
    }

    public void setPerson(String person) {
        this.person = person;
    }

    public String getCharter() {
        return charter;
    }

    public void setCharter(String charter) {
        this.charter = charter;
    }

    public String getPost() {
        return post;
    }

    public void setPost(String post) {
        this.post = post;
    }

    public String getSignature() {
        return signature;
    }

    public void setSignature(String signature) {
        this.signature = signature;
    }

    public Integer getPlaceId() {
        return placeId;
    }

    public void setPlaceId(Integer placeId) {
        this.placeId = placeId;
    }

    public java.sql.Date getOperationDate() {
        return operationDate;
    }

    public String getOperationUser() {
        return operationUser;
    }

    public void setOperationUser(String operationUser) {
        this.operationUser = operationUser;
    }

    public void setOperationDate(java.sql.Date operationDate) {
        this.operationDate = operationDate;
    }

}


Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="show_sql">false</property>
        <property name="use_outer_join">false</property>
        <property name="connection.username">***</property>
        <property name="connection.password">***</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.autocommit">false</property>
        <property name="connection.url">jdbc:mysql://****:****/****?lc_ctype=KOI8-R</property>

        <mapping resource ="MailSender/Database/RecordsData.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

Автор: tux 22.9.2006, 10:04
А MailSender/Database/RecordsData.hbm.xml? smile

Добавлено @ 10:07 
Вот, кстати, у тебя почему диалект для PostgreSQL - org.hibernate.dialect.PostgreSQLDialect?

Добавлено @ 10:07 
Должен быть такой - org.hibernate.dialect.MySQLDialect.

Автор: Nobody 22.9.2006, 10:46
У нас была такая же проблема, лучшее решение - выкинуть mysql. Он ставит такие даты, когда в колонку, объявленную как NOT NULL пытаются вставить нулловые даты. В принципе лечится выставлением default null (Хмм, а это уже сделано). Значит явно проверять даты. Либо перевести mysql в http://dev.mysql.com/doc/mysql/en/server-sql-mode.html. Для того, чтобы починить существующие даты, надо на что-нибудь изменить эти 0000-00-00 на что-нибудь содержательное.

Автор: Bulat 22.9.2006, 11:03
Цитата(tux @  22.9.2006,  10:04 Найти цитируемый пост)
MailSender/Database/RecordsData.hbm.xml?

упустил smile , счас
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="MailSender.Database.RecordsData"
    table="Records">

        <id name="userId" type="integer"
            unsaved-value="null">
            <column name='user_id' sql-type="int(8)"
            not-null="true"/>
            <generator class="uuid.hex"/>
        </id>

        <property name="recordId">
            <column name="record_id" sql-type="int(5)"
            not-null="true"/>
        </property>

        <property name="balance">
            <column name="balance" sql-type="double"
            not-null="true"/>
        </property>

        <property name="limit">
            <column name="limit" sql-type="double"
            not-null="true"/>
        </property>

        <property name="description">
            <column name="description" sql-type="varchar(128)"
            not-null="true"/>
        </property>

        <property name="flag">
            <column name="flag" sql-type="int(5)"
            not-null="true"/>
        </property>

        <property name="contract">
            <column name="contract" sql-type="varchar(32)"
            not-null="false"/>
        </property>

        <property name="contractDate">
            <column name="contract_date" sql-type="datetime"
            not-null="false"/>
        </property>

        <property name="address">
            <column name="address" sql-type="varchar(64)"
            not-null="false"/>
        </property>

        <property name="gender">
            <column name="gender" sql-type="char(2)"
            not-null="true"/>
        </property>

        <property name="person">
            <column name="person" sql-type="varchar(255)"
            not-null="true"/>
        </property>

        <property name="charter">
            <column name="charter" sql-type="varchar(40)"
            not-null="true"/>
        </property>

        <property name="post">
            <column name="post" sql-type="varchar(64)"
            not-null="true"/>
        </property>

        <property name="signature">
            <column name="signature" sql-type="varchar(64)"
            not-null="true"/>
        </property>

        <property name="placeId">
            <column name="place_id" sql-type="int(3)"
            not-null="true"/>
        </property>

        <property name="operationDate">
            <column name="operation_date" sql-type="datetime"
            not-null="true"/>
        </property>

        <property name="operationUser">
            <column name="operation_user" sql-type="varchar(64)"
            not-null="true"/>
        </property>

    </class>
</hibernate-mapping>


Цитата(tux @  22.9.2006,  10:04 Найти цитируемый пост)
Вот, кстати, у тебя почему диалект для PostgreSQL - org.hibernate.dialect.PostgreSQLDialect?

Ценное замечание, пасиба smile 

Nobody, в том-то и проблема, что ничем заполнить лично я не могу, это важная информация, а те кто могут........ пока их ждать уж проще найти выход smile 

Автор: tux 22.9.2006, 13:52
В коде и маппингах не вижу ничего криминального. Видимо все-таки проблема в том, о чем говорит Nobody.

Автор: Bulat 25.9.2006, 09:04
Цитата(Nobody @  22.9.2006,  10:46 Найти цитируемый пост)
Либо перевести mysql в другой режим.

Имеешь в виду ALLOW_INVALID_DATES ?

Автор: Ignat 26.9.2006, 09:46
А выбирать дату мускулевской ф-цией DATE_FORMAT тебе не поможет?

Автор: Bulat 26.9.2006, 10:58
Цитата(Ignat @  26.9.2006,  09:46 Найти цитируемый пост)
А выбирать дату мускулевской ф-цией DATE_FORMAT тебе не поможет?

нет, все равно не хочет smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)