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

峯本 和浩 [E-MAIL ADDRESS DELETED]
2012年 10月 30日 (火) 07:54:03 JST


お疲れ様です。峯本です。

SNAPSHOTを試し、問題が解決したことを確認しました。
また、回避策でもうまくいくことも確認しました。

対応ありがとうございました。

(2012/10/28 14:26), Toshihiro Nakamura wrote:
> 中村(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
> 
> 
> 


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