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;
我有以下列定义:
@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;