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

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2012年 10月 28日 (日) 14:26:06 JST


中村(taedium)です。

報告ありがとうございます。
ご指摘のとおり時刻のフォーマットが間違っていました。

修正してSNAPSHOTを作成しました。
もしよければ、お試しください。
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2jdbc-gen/2.4.47-SNAPSHOT/s2jdbc-gen-2.4.47-20121028.050603-1.jar


ちなみにですが、以下の手順を踏むことで、
2.4.46のバージョンのままでこの問題に対応できます。

(1) TimeTypeを継承して正しいフォーマットを使うように
修正したクラスを作成する(仮にMyTimeTypeと呼びます)。

(2) MysqlGenDialectを継承し、コンストラクタで以下のような記述を追加する。

  sqlTypeMap.put(Types.TIME, new MyTimeType());

(3) S2JDBC-GenのAntタスクのパラメータgenDialectClassName
に(2)の手順で作成したクラスの完全修飾名を指定する。


2012年10月25日 11:02 峯本 和浩 <minemoto.kazuhiro @ tis.co.jp>:
> お世話になっております。峯本と申します。
>
> 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 mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user



-- 
Toshihiro Nakamura


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