在jpa@column中声明的默认值(column nDefinition.)持久化时未设置 [英] Default value declared in JPA @Column( columnDefinition ... ) not set when persisted

查看:36
本文介绍了在jpa@column中声明的默认值(column nDefinition.)持久化时未设置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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,没有插入零值。

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

jpa

空值是因为如果没有实现特殊处理,推荐答案会显式地将null值插入到该列中。columnDefinition确实使用默认设置创建列,但它不会使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;
}

这篇关于在jpa@column中声明的默认值(column nDefinition.)持久化时未设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆