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

时间:2019-01-06 18:30:39

标签: postgresql jpa java-ee entity eclipselink

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

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

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

value_x bigint DEFAULT 0,

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

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

1 个答案:

答案 0 :(得分:3)

Null值是因为,如果未实现特殊处理,JPA会在该列中显式插入一个null值。 columnDefinition确实使用DEFAULT进行了列的创建,但是并没有使JPA知道/或事后服从它。

它是可空列,因此没有错误。看看普通的SQL会发生什么,请看下面的表:

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

然后插入:

insert into example (col1) values (null);

然后选择:

select * from example;

将显示如下结果:

  

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

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

例如,请参见this question,请注意,接受的答案不是有效的答案,而是this answer。因此,在实例化类时设置值:

private Long valueX = 0;

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

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