こういう感じでdefault値を指定したとする。
create table TEST( id integer primary key, dt timestamp default CURRENT_TIMESTAMP);
マッピングがこんな風になる
@Entity public class Test{ @Id @Column Integer id; @Column @Temporal(TemporalType.TIMESTAMP) Date dt; }
で、こんな感じで追加する
EntityManager em; void hoge(){ Test t = new Test(); t.id = 1; t.dt = null; em.persist(t); }
そうすると、dtフィールドはNULLになってしまう。
こんなSQLだとちゃんと日付が指定されるのでdefault指定自体に問題はない。
insert into Test(id) values(1);
なので、insertableをfalseにしてみる。
@Column(insertable=false) @Temporal(TemporalType.TIMESTAMP) Date dt;
でもやっぱりdtフィールドはNULLになる。
このときこんなSQLが生成されてるようだ
insert into TEST(id, dt) values(1, NULL);
つまり、Derbyでは値にNULLを指定するとdefault値じゃなくNULLが格納される。
仕方がないので、Java側でデフォルト値を決める。
@Column @Temporal(TemporalType.TIMESTAMP) Date dt = new Date();
NULLを指定してもdefault値を使ってくれないDerbyが悪いのか、insertable=falseのフィールドに対してNULLを指定するTopLinkが悪いのか。