JPA @Column( columnDefinition ... ) 中声明的默认值在持久化时未设置

eXP*_*ESS 2 postgresql entity jpa eclipselink jakarta-ee

我的 Java 实体中有这样的属性:

@Basic(fetch = FetchType.LAZY) //I tried without this as well
@Column(name = "value_x", columnDefinition = "bigint default 0")
private Long valueX;
Run Code Online (Sandbox Code Playgroud)

在 pgAdmin 的表定义中,我看到:

value_x bigint DEFAULT 0,
Run Code Online (Sandbox Code Playgroud)

但是当插入对象时(此属性为空),列为空/空,没有插入 0 值。

任何人都会知道为什么它不插入默认值?使用 EclipseLink。

pir*_*rho 5

空值是因为null如果没有实现特殊处理,JPA 会显式地将值插入到该列中。在columnDefinition不使列创建与默认值,但它不会使JPA意识到/或之后服从它。

它是一个可为空的列,因此没有错误。看看在普通 SQL 中发生了什么,想想这张表:

create table example (
    col1 bigint default 42,
    col2 bigint default 99
);
Run Code Online (Sandbox Code Playgroud)

然后做一个插入,如:

insert into example (col1) values (null);
Run Code Online (Sandbox Code Playgroud)

然后选择:

select * from example;
Run Code Online (Sandbox Code Playgroud)

将显示如下结果:

列 1 | col2
------+------
(null) | 99

如果您需要在 Java 端管理默认值,则在 Java 端需要一些特殊的东西。

例如,请参阅此问题并注意接受的答案不是有效答案而是此答案。所以在实例化类时设置值:

private Long valueX = 0;
Run Code Online (Sandbox Code Playgroud)

另一种方法是作为不同问题的这个答案所暗示的,使用 @PrePersist

@PrePersist
void prePersist() {
    if (this.valueX == null)
       this.valueX = 0;
}
Run Code Online (Sandbox Code Playgroud)