为什么未设置 TIMESTAMP DEFAULT CURRENT_TIMESTAMP?

Why is TIMESTAMP DEFAULT CURRENT_TIMESTAMP not set?

我这样定义了一个 Oracle table:

CREATE TABLE MANUAL_CORRECTION
(
    ID                NUMBER(19,0) NOT NULL,
    MODIFIED          TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    MODIFIED_BY       NUMBER(19,0) NOT NULL,
    MODIFIED_PROPERTY VARCHAR2(20 BYTE) NOT NULL,
    OLD_VALUE         VARCHAR2(20 BYTE) NOT NULL,
    NEW_VALUE         VARCHAR2(20 BYTE) NOT NULL,
    CONSTRAINT MODIFIED_BY_FK FOREIGN KEY (MODIFIED_BY) REFERENCES BENUTZER (ID) ENABLE,
    PRIMARY KEY (ID)
);

我想通过运行良好的 JPA 插入记录,但 MODIFIED 列始终保持为 NULL,尽管我指定它应该默认设置为系统时间戳。 每当新的 entity/record 被持久化时,如何设置系统时间戳?

我是这样定义 column/entity 属性:

  @Column(name = "MODIFIED", nullable = false, updatable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
  private Timestamp modified;

我认为您的 JPA 正在显式发送 NULL 作为列的值,并且仅当您未在插入列子句中指定时才应用默认值。

Insert into <table> (col1, col2) values (1, null) -- col2 - default value will not be applied
Insert into <table> (col1) values (1) -- col2 - default value will be applied

因此,如果您希望在显式传递 NULL 作为列值时应用默认值,您可以使用 Oracle 12c 的新功能,即 default on null

参考这个doc

干杯!!