[Seasar-user:21484] [S2JDBC-Gen]TIME型のデータがdump-dataとload-dataで復元できない

峯本 和浩 [E-MAIL ADDRESS DELETED]
2012年 10月 25日 (木) 11:02:00 JST


お世話になっております。峯本と申します。

S2JDBC-GenとmysqlでTIME型のカラムを扱っていると、表記の挙動に遭遇した
ので報告します。

■現象
MYSQLがTIME型で、対応するentityのプロパティがjava.sql.Timeとなっている場合、
12:00:00〜23:59:59の値が dump-data,load-dataで復元できない

■環境
・S2JDBC-Gen 2.4.46
・java 1.6.0_32
・mysql 5.5.21

■手順
次のテーブルを作成し、データを投入します。
CREATE TABLE sample_tbl(fld_time TIME);
INSERT INTO sample_tbl(fld_time)values('00:00:00'),('01:00:00'),('12:00:00'),('13:00:00'),('23:00:00'),('23:59:59');
SELECT * FROM sample_tbl;
+----------+
| fld_time |
+----------+
| 00:00:00 |
| 01:00:00 |
| 12:00:00 |
| 13:00:00 |
| 23:00:00 |
| 23:59:59 |
+----------+

entityクラスは、次のように作成します。

@Entity
public class SampleTbl implements Serializable {
  private static final long serialVersionUID = 1L;
  @Column(nullable = true, unique = false)
  public java.sql.Time fldTime;
}

この状態でantからdump-data後、データを消してload-dataで再投入します。

■結果
12時以降が12時間引かれたデータに変わってしまいます。

SELECT * FROM sample_tbl;
+----------+
| fld_time |
+----------+
| 00:00:00 |
| 01:00:00 |
| 00:00:00 |
| 01:00:00 |
| 11:00:00 |
| 11:59:59 |
+----------+

■原因
dump-dataで生成されるcsvが次のようになっています。
"FLD_TIME"
"12:00:00"
"01:00:00"
"12:00:00"
"01:00:00"
"11:00:00"
"11:59:59"

これは、internal/sqltype/TimeType.javaのgetValue内でString変換する時に
StringConversionUtil.toString(value, "hh:mm:ss")
と行っているためだと思います。
フォーマットとしては、HH:mm:ssが正しいと思います。
同様に、同クラスのbindValue内での書式も修正が必要と思います。



実際のデータベースのTIME型は24:00:00以上の長時間やマイナス時間も
入るのですが、その場合はjava.sql.Timeで扱う事が間違えていると思います。

しかし一日の時刻としてTIME型/java.sql.Timeを使っているとすると、
dump,loadで復元できないのは問題かなと思っています。

以上、よろしくお願いいたします。


Seasar-user メーリングリストの案内