2013-03-29

Hibernate 無法讀取 MySQL 的 0000-00-00

使用 Hibernate 讀取既有的資料庫,在遇到日期格式的欄位值為 0000-00-00 時發生錯誤。

事實上,這是 JDBC 發生的錯誤,不是 Hibernate。

SEVERE: Servlet.service() for servlet bisch threw exception
java.sql.SQLException: Value '... 0000-00-00 ...'
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
 at com.mysql.jdbc.ResultSetRow.getDateFast(ResultSetRow.java:141)
 at com.mysql.jdbc.BufferRow.getDateFast(BufferRow.java:707)
 at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2210)
 at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2172)
 at com.mysql.jdbc.ResultSetImpl.getDate(ResultSetImpl.java:2237)
 at com.mchange.v2.c3p0.impl.NewProxyResultSet.getDate(NewProxyResultSet.java:3212)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:104)
 at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
 at $Proxy47.getDate(Unknown Source)
因為是既有資料庫,所以不方便將 0000-00-00 改成 Null。

Google 得到的結論,這是 MySQL 特有的問題,因此 MySQL 也有專屬的解答。

只要在連線 Url 加上 zeroDateTimeBehavior=convertToNull 這個參數就好了。

<hibernate-configuration>
  <session-factory>
    <property name="connection.driver_class"> com.mysql.jdbc.Driver</property>
    <property name="connection.url">
   <![CDATA[jdbc:mysql://localhost/legacyDB?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull]]>
    </property>

    <!-- ... -->

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

沒有留言:

張貼留言