我在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。
答案 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;
}