避免通过 JPA 将“null”值插入数据库表

2022-09-01 11:31:34

我从JPA2开始,到目前为止感觉很舒服。但是,在为具有默认值的NON NULL数据库字段保留具有空属性值的实体时,我遇到了一个问题。

我希望能够将实体属性保留为空,并让数据库插入默认值。

我目前的设置是 openJPA with PostgreSQL。

我有这个版本数据库表(Vorgabewert = 默认值):


     Spalte     |             Typ             |         Attribute
----------------+-----------------------------+----------------------------
 status_        | smallint                    | not null Vorgabewert 0
 time_          | timestamp without time zone | not null
 system_time    | timestamp without time zone | not null Vorgabewert now()
 version        | character varying(20)       | not null
 activationtime | timestamp without time zone |
 importtime     | timestamp without time zone |

我有一个实体(Java DTO),它通过xml配置映射数据库字段(“状态”除外)。

我希望我可以插入一个没有设置的实体,并期望数据库将当前时间填充为默认值。system_time

JPA 构造以下 SQL 查询:

INSERT INTO public.version (version, activationtime, importtime, system_time, time_) VALUES (?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?]

Postgres的反应是:

FEHLER: NULL-Wert in Spalte »system_time« verletzt Not-Null-Constraint(抱歉德语,但此消息表示“system_time”上的非空约束冲突)。

那我该怎么办呢?这是JPA还是数据库问题。是否可以将 JPA 配置为从 INSERT SQL 语句中排除空属性。

我希望能够在我的实体中设置“system_time”,或者让它为“null”并让数据库输入默认值。

欢迎任何帮助!

雷加兹·克劳斯


答案 1

我不会将数据库中的默认值与 JPA 结合使用。您必须在插入后读回实体,否则实体状态与数据库状态不匹配。

在此处选择实用方法,并在 java 中初始化所有值。从未听说过一种方法可以告诉JPA / Hibernate在插入/更新中省略空值。


答案 2

使用批注

@Column(insertable = false)

将阻止在 sql 中生成值。


推荐