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。
空值是因为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)
| 归档时间: |
|
| 查看次数: |
6475 次 |
| 最近记录: |