In einer Tabelle meiner Postgresql db, habe ich 2 Spalten mit Standardwert.jOOQ Konverter legte implizit einen Wert beim Schreiben eines Datensatzes
Ich definiere einen Konverter für einen von ihnen in jOOQ Generatorkonfiguration.
Wenn ich die Funktion record.store() ausführen, wird der Standardwert für das Feld ohne Konverter gut verwendet, aber nicht für den anderen, der Null wird.
Ich nie explizit diese Felder festlegen, aber ich denke, dass record.changed (MY_OBJECT.FIELD) == True nach der Ausführung des Konverters.
Ich bin mir nicht sicher, dass dies das erwartete Verhalten ist. Ist es ein Fehler? Gibt es dafür einen Workaround?
Edit: Hier ist der Code verwendet
TimestampBinding.java
public class TimestampBinding implements Binding<Timestamp, Instant> {
private static final Converter<Timestamp, Instant> converter = new TimestampConverter();
private final DefaultBinding<Timestamp, Instant> delegate = new DefaultBinding<> (converter());
@Override
public Converter<Timestamp, Instant> converter() { return converter; }
@Override
public void sql(BindingSQLContext<Instant> ctx) throws SQLException {
delegate.sql(ctx);
}
@Override
public void register(BindingRegisterContext<Instant> ctx) throws SQLException {
delegate.register(ctx);
}
@Override
public void set(BindingSetStatementContext<Instant> ctx) throws SQLException {
delegate.set(ctx);
}
@Override
public void set(BindingSetSQLOutputContext<Instant> ctx) throws SQLException {
delegate.set(ctx);
}
@Override
public void get(BindingGetResultSetContext<Instant> ctx) throws SQLException {
delegate.get(ctx);
}
@Override
public void get(BindingGetStatementContext<Instant> ctx) throws SQLException {
delegate.get(ctx);
}
@Override
public void get(BindingGetSQLInputContext<Instant> ctx) throws SQLException {
delegate.get(ctx);
}
}
TimestampConverter.java
public class TimestampConverter implements Converter<Timestamp, Instant> {
@Override
public Instant from(Timestamp ts) {
return ts == null ? null : ts.toInstant();
}
@Override
public Timestamp to(Instant instant) {
return instant == null ? null : Timestamp.from(instant);
}
@Override
public Class<Timestamp> fromType() { return Timestamp.class; }
@Override
public Class<Instant> toType() { return Instant.class; }
}
sql
CREATE TABLE user (
id uuid PRIMARY KEY,
active boolean NOT NULL DEFAULT false,
created_at timestamptz DEFAULT now()
);
store Rekord
user.setId(UUID.randomUUID());
UserRecord userRecord = DSL.using(conn, SQLDialect.POSTGRES_9_3)
.newRecord(userTable.USER, user);
userRecord.store();
Das ist ein Fehler sehr wahrscheinlich ist. Können Sie möglicherweise Code anzeigen, um das Problem zu reproduzieren? –
Ich habe gerade den Code hinzugefügt, danke im Voraus für Ihre Hilfe – Manu