2017-01-16 4 views
0

ActiveJDBCを使用してdbからモデルを読み込めません。ActiveJDBC、SQLとnullタイムスタンプ生成SQLException

基本的に、私はModelClass.findFirst(...)を実行しており、SQLExceptionがポップアップします。タイムスタンプフィールドがゼロでない場合、問題はないようです。

このモデルには、ゼロ/ヌル値を持つmysqlタイムスタンプ(datetimeを試した)フィールドがあります。この例は値 '0000-00-00 00:00:00'のタイムスタンプです。実際の日付/時刻に値を更新すると、モデルオブジェクトにエラーが発生することはありません。

Caused by: java.sql.SQLException: Value '10151payment100.0012002017-01-16 02:06:530000-00-00 00:00:002017-01-16 03:36:43noFirst Last 
+358 40 123456b989e4dce9e639eaadbed3b64e2c3eb' can not be represented as java.sql.Timestamp 

私の質問は - 私はこのコラムでは、任意の日付+時刻を格納する必要があり、その値が格納されていない場合に便利な理由のためには、nullまたはゼロにする必要があります。これはActiveJDBCとの組み合わせですか?

EDIT:以下に示す最小限の例です。

CREATE TABLE test (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    ts timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
insert into test (id) values (1); 

モデルソース

import org.javalite.activejdbc.Model; 
import org.javalite.activejdbc.annotations.Table; 

@Table("test") 
public class Test extends Model { 

} 

メインクラス

import com.zaxxer.hikari.HikariDataSource; 
import javax.sql.DataSource; 
import org.javalite.activejdbc.Base; 

public class ActiveJDBCTest { 
    private HikariDataSource dbds; 
    public ActiveJDBCTest() { 
     try { 
      init();    
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    public void init() throws ClassNotFoundException { 
     Class.forName("com.mysql.jdbc.Driver"); 
     dbds = new HikariDataSource(); 
     dbds.setJdbcUrl("jdbc:mysql://localhost:3306/test" + 
       "?useSSL=false" + 
       "&characterEncoding=UTF-8"); 
     dbds.setUsername("test"); 
     dbds.setPassword("test"); 
     dbds.setConnectionInitSql("SET @@session.time_zone = '+00:00'"); 
     Base.open(dbds); 
     Test first = Test.findFirst("id = ?", 1); 
     Base.close(); 
    } 

    public static void main(String[] args) { 
     new ActiveJDBCTest(); 
    } 
} 

結果(実際の例外メッセージのために埋め込まれた画像を参照してください - ?ヌル文字)を

org.javalite.activejdbc.DBException: java.sql.SQLException: Value '10000-00-00 00:00:00' can not be represented as java.sql.Timestamp 

Result

+0

テーブルのDDLを含めてください – ipolevoy

答えて

0

フルスタックトレースとDDLがなければ、私はあなたがあなたの列に次の値を持っていることを見ることができます:

10151payment100.0012002017-01-16 02:06:530000-00-00 00:00:002017-01-16 03:36:43noFirst Last 
+358 40 123456b989e4dce9e639eaadbed3b64e2c3eb 

MySQLドライバがそれcan not be represented as java.sql.Timestampことを語っています。私はあなたに何らかのデータ破損の問題があると思う。私はそれがActiveJDBCに関係しているとは思わない。

0

オハイオ州の地獄、あなたの時間を無駄にして申し訳ありません。私はそれを明らかに理解した。

ある地点のdbは、mysqlからmariadbに変更されています。mariadbでmysql connector/jを使用している間は、ドライバの互換性に問題があります。 mariadbドライバを使用すると問題は解決します。

関連する問題