在 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
注释。
我的 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
注释。