Spring Data JPA 和默认值



在我的数据库表中,我有一个属性的默认值,例如

CREATE TABLE my_table (
...
my_attribute INTEGER DEFAULT 0,
...
);

如果我尝试使用 Spring Data repo.save(object) 保存我的 Java 对象,然后使用 findById(id) 按 id 搜索它,我会得到该对象,但如果我使用 Integer(不是 int),则不会设置默认值。

为什么没有设置?

如何解决?

如果我使用 SQL 在表中插入一个条目,则设置默认值 0。 嗯......

因为null也是一个值:

代码中会发生什么?

当您致电 :

private Integer myAttribute;

默认值为null,因为整数是一个对象。 因此,当您尝试插入 null 值时,即使 JPA 会将null设置为myAttributeDEFAULT 0,查询应该是:

INSERT INTO table0002 values (null);

..当您插入null时,请检查演示中发生的情况:

https://rextester.com/IJUT84677

该值是插入的! 带有null而不是0

现在让我们尝试另一个 INSERT,而不在查询中指定my_attribute

https://rextester.com/FGASH67830

我们不在查询中指定my_attribute,因此使用默认值。 文件说:

5.2. 默认值

可以为列分配默认值。创建新行时 并且没有为某些列指定值,这些列 将填充其各自的默认值。一个数据 操作命令还可以显式请求设置列 到其默认值,


要解决此问题,您只需使用:

private Integer myAttribute = 0; // set hard value in the code

此外,您还可以使用NOT NULL来确保查询不会插入 NULL:

my_attribute INTEGER NOT NULL DEFAULT 0

这可能会导致violates not-null constraint因此请注意,当您调用 INSERT 时,您必须设置默认值 non null,如果您尝试这样做,请检查您会得到什么。

https://rextester.com/LMTTOO35342

我不确定。如果仅在数据库中设置默认值,则答案可以处于实体的状态。我的意思是您使用未设置默认值的会话中的数据。在这种情况下,您可以使用方法flush()(EntityManager)。

最新更新