避免通过JPA向数据库表插入'null'值

FrV*_*aBe 18 java postgresql orm jpa jpa-2.0

我从JPA2开始,到目前为止感觉相当舒适.但是,当使用默认值为NON NULL数据库字段保留具有null属性值的实体时,我遇到了问题.

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

我目前的设置是使用PostgreSQL的openJPA.

我有这个VERSION数据库表(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配置映射数据库字段('status'除外).

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

JPA构造以下SQL-Query:

INSERT INTO public.version (version, activationtime, importtime, system_time, time_) VALUES (?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?]
Run Code Online (Sandbox Code Playgroud)

和Postgres作出反应:

FEHLER: NULL-Wert in Spalte »system_time« verletzt Not-Null-Constraint (对不起德语,但此消息表示'system_time'上的Not-Null-Constraint违规).

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

我希望能够在我的实体中设置'system_time'或让它为'null'并让数据库设置默认值.

欢迎任何帮助!

致克劳斯

Sto*_*ica 21

使用注释

@Column(insertable = false)
Run Code Online (Sandbox Code Playgroud)

将阻止在sql中生成的值.

  • 提示+1 - 但这也会阻止生成非空值。在本例中,我希望获得 SQL 语句中的值。似乎没有办法实现这种行为.. (4认同)
  • 啊,我明白了.没有办法做到这一点.您必须决定Java或DBMS是否会对时间负责,您不能混合使用两者. (2认同)

ber*_*ert 19

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

在这里选择实用的方法并初始化java中的所有值.从来没有听说过告诉JPA/Hibernate在插入/更新中省略空值的方法.

  • 好点 - 我希望坚持这个对象并将其带到'托管'状态将包括一种回读操作. (2认同)
  • 由于重要的“状态不匹配”注释,接受了这个答案。答案还指出,没有办法做我想做的事情:-(。 (2认同)

小智 6

在Annotation @Column中,将atribute可插入为false,如下所示:

`@Column(name="system_time", insertable = false)`

或者,如果您需要检查值是否为NULL,则在表上进行"插入前触发".