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

Default value declared in JPA @Column( columnDefinition ... ) not set when persisted

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

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

在 pgAdmin 的 table 定义中我看到:

value_x bigint DEFAULT 0,

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

谁知道为什么不插入默认值?使用 EclipseLink。

Null 值是因为如果没有实施特殊处理,JPA 会在该列中显式插入一个 null 值。 columnDefinition 确实使用 DEFAULT 创建列,但它不会让 JPA 知道 of/or 之后遵守它。

而且它是一个可以为 null 的列,所以没有错误。看看普通 SQL 会发生什么,想想这个 table:

create table example (
    col1 bigint default 42,
    col2 bigint default 99
);

然后像这样插入:

insert into example (col1) values (null);

然后选择:

select * from example;

会显示如下结果:

col1 | col2
------+------
(null) | 99

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

参见示例 this question and note that the accepted answer is not the working one but this answer。所以实例化class时设置值:

private Long valueX = 0;

另一种方法是 this answer for different question 建议的,使用 @PrePersist:

@PrePersist
void prePersist() {
    if (this.valueX == null)
       this.valueX = 0;
}

我找到了另一种方法来解决同样的问题,因为当我创建自己的对象并持久保存在数据库中时,不遵守具有默认值的 DDL。

所以我查看了我的控制台,生成了 SQL,看到所有字段都有插入,但我的对象中只有一个属性的值发生了变化。

所以我在模型中加入了class这个注解。

@DynamicInsert

插入数据时,框架不会插入空值或未修改的值,使插入更短。

还有 @DynamicUpdate 注释。