JPA EclipseLink:处理默认值

JPA EclipseLink: handle default value

我有以下列定义:

@Column(name="active", nullable=false, columnDefinition="BOOLEAN DEFAULT FALSE"
private Boolean active;

在 Postgres 数据库中,列 active 定义为 BOOLEAN NOT NULL DEFAULT FALSE

但是当我插入一条新记录时,没有设置 active,EclipseLink 为这个字段生成了一个 null 值并且插入语句显然失败了,因为 Postgres 不允许 null NOT NULL 列的值。

我做错了什么?

好吧,如果我将我的字段定义为

private boolean active;

然后我会间接将该字段设置为false。但是我不能将此技巧用于 Date 字段。因此,我正在寻找适用于所有列类型的解决方案。

columnDefinition 仅用于创建 DDL,并且可以是特定于数据库的。如果您使用它,您可能会在切换数据库时遇到问题。

使用基本类型确保值不为空,并且在没有显式定义值的情况下,使用基本类型的默认值。但是,您也可以通过分配非原始值来定义默认值:private Boolean active = false; 这也适用于 Date.

当您需要复杂的默认值时,您可以使用 PrePersist 注释:

    @PrePersist
    public void setDefaultValues() {
        if (active == null) {
            active = false;
        }
        if (value == null) {
           //do complex stuff
        }
    }

如果您永远不打算设置该属性,您可以使用 @Column (insertable = false),如果您设置了一个值,无论如何都会被忽略。 这是 Date 上非常常见的设置,例如

@Column(nullable = false, insertable = false, updatable = false, columnDefinition = "timestamp not null default CURRENT_TIMESTAMP")
    @Temporal(TemporalType.TIMESTAMP)
    private Date systemDate;