Joda DateTimes で JooQ POJO を生成しようとしていますが、問題が発生しています。POJO は、DateTime ではなく、デフォルトの java.sql.TimeStamp 値でジェネレーターから出力されます。
以下のコード。
テーブルの作成 -- ここのタイムスタンプ フィールドの名前が変更されました -- ビルド システムのどこかでキャッシュにアクセスしていないことを確認したかったのです。この名前は、マッチングのために以下の正規表現で引き続き機能するはずです。
CREATE TABLE nonsense (
name VARCHAR(50) NOT NULL,
DATETIME_TEST TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
id UUID NOT NULL,
PRIMARY KEY(id)
);
変換クラス --ドキュメントに基づく。
public class LocalDateTimeConverter implements Converter<Timestamp, LocalDateTime> {
@Override
public LocalDateTime from(Timestamp databaseObject) {
return new LocalDateTime(databaseObject.getTime());
}
@Override
public Timestamp to(LocalDateTime dt) {
return new Timestamp(dt.toDateTime().getMillis());
}
@Override
public Class<Timestamp> fromType() {
return Timestamp.class;
}
@Override
public Class<LocalDateTime> toType() {
return LocalDateTime.class;
}
}
Jooq 構成 XML。ドキュメントに基づいています (私の式/式エラー Luke を見つけてくれてありがとう)!
<configuration>
<generator>
<database>
<customTypes>
<customType>
<name>org.joda.time.LocalDateTime</name>
<converter>n.b.jooqJodaTime.LocalDateTimeConverter</converter>
</customType>
</customTypes>
<forcedtypes>
<forcedType>
<name>org.joda.time.LocalDateTime</name>
<expressions>.*DATETIME.*</expressions>
</forcedType>
</forcedtypes>
</database>
</generator>
</configuration>
POJO を作成しました:
@javax.persistence.Column(name = "DATETIME_TEST", precision = 23, scale = 10)
public java.sql.Timestamp getDatetimeTest() {
return this.datetimeTest;
}
歴史的な文脈では、これが最初の質問でした。
テーブルの作成:
CREATE TABLE nonsense ( name VARCHAR(50) NOT NULL, TEST_DATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, id UUID NOT NULL, PRIMARY KEY(id) );
コンバータ:
package n.b.jooqJodaTime; import org.joda.time.DateTime; import org.jooq.Converter; import java.sql.Timestamp; public class DateTimeConverter implements Converter<Timestamp, DateTime> { @Override public DateTime from(Timestamp databaseObject) { return new DateTime(databaseObject.getTime()); } @Override public Timestamp to(DateTime dt) { return new Timestamp(dt.getMillis()); } @Override public Class<Timestamp> fromType() { return Timestamp.class; } @Override public Class<DateTime> toType() { return DateTime.class; } }
Jooq 構成:
<configuration> <jdbc> <url>jdbc:h2:file:build/database</url> <driver>org.h2.Driver</driver> <user>sa</user> </jdbc> <generator> <database> <name>org.jooq.util.h2.H2Database</name> <inputSchema>PUBLIC</inputSchema> <includes>.*</includes> <customTypes> <customType> <name>org.joda.time.DateTime</name> <converter>n.b.jooqJodaTime.DateTimeConverter</converter> </customType> </customTypes> <forcedtypes> <forcedType> <name>org.joda.time.DateTime</name> <expression>.*DATETIME.*</expression> </forcedType> </forcedtypes> </database> <generate> <pojos>true</pojos> <immutablePojos>true</immutablePojos> <jpaAnnotations>true</jpaAnnotations> <validationAnnotations>true</validationAnnotations> <deprecated>false</deprecated> </generate> <target> <packageName>n.b.c.generated.jooq</packageName> <directory>src/main/java/</directory> </target> </generator> </configuration>
結果は次のとおりです。
/** * The column <code>PUBLIC.NONSENSE.TEST_DATETIME</code>. */ public final org.jooq.TableField<n.b.c.generated.jooq.tables.records.NonsenseRecord,
java.sql.Timestamp> TEST_DATETIME = createField("TEST_DATETIME", org.jooq.impl.SQLDataType.TIMESTAMP, this);
これを次のようにしたい:
/** * The column <code>PUBLIC.NONSENSE.TEST_DATETIME</code>. */ public final org.jooq.TableField<n.b.c.generated.jooq.tables.records.NonsenseRecord,
org.joda.time.DateTime> TEST_DATETIME = createField("TEST_DATETIME", org.jooq.impl.SQLDataType.TIMESTAMP, this);