Gen-Entityでの日付型プロパティ

これまで、S2JDBC-GenのGen-Entityタスクは、日付型のカラムに対するプロパティは@Temporalつきのjava.util.Date型であるものとしてコードを生成してきました。こんな感じ。

import java.util.Date;
...

@Entity
public class Foo {

    /** idプロパティ */
    @Id
    @Column(nullable = false, unique = false)
    public int id;

    /** dateプロパティ */
    @Temporal(TemporalType.DATE)
    @Column(nullable = true, unique = false)
    public Date date;

    /** timeプロパティ */
    @Temporal(TemporalType.TIME)
    @Column(nullable = true, unique = false)
    public Date time;

    /** timestampプロパティ */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = true, unique = false)
    public Date timestamp;
}

見た目にはきれいなのですが、型を変換する際にアノテーションまでみないと正しく変換できないため、S2JDBCの外で使おうとすると使いにくいという問題を抱えています。また、S2JDBCを利用する場合であってもごく一部のAPIで@Temporalを使っていることを意識しなければいけませんでした。それともう1つ挙げると、@Temporal(TemporalType.TIMESTAMP)のjava.util.Dateでは、java.sql.Timestampならば保持できるナノ秒を保持できないという弱点もあります。


そこで、次のバージョン(2.4.34)からは、より型が硬いjava.sqlパッケージのDate、Time、Timestampを使ったコードを生成しようと思います。上のコードはこうなります。

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
...

@Entity
public class Foo {

    /** idプロパティ */
    @Id
    @Column(nullable = false, unique = false)
    public int id;

    /** dateプロパティ */
    @Column(nullable = true, unique = false)
    public Date date;

    /** timeプロパティ */
    @Column(nullable = true, unique = false)
    public Time time;

    /** timestampプロパティ */
    @Column(nullable = true, unique = false)
    public Timestamp timestamp;
}


エンティティがjava.sqlパッケージに依存することに抵抗を感じる人もいるかもしれません。その場合は、ビルドファイルでuseTemporalTypeにtrueを指定してもらえれば、これまでどおり@Temporalを使ったコードが生成されます。useTemporalTypeの指定例は次のとおりです。

<gen-entity
    rootPackageName="examples"
    useTemporalType="true"
    classpathRef="classpath"
/>