Spring Data JPA和默认值

问题描述 投票:1回答:2

在我的db表中,我有一个属性的默认值

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

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

为什么没有设置?

怎么解决?

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

java postgresql jpa spring-data-jpa
2个回答
1
投票

因为null也是一个值:

代码中发生了什么?

你打电话的时候 :

private Integer myAttribute;

默认值为null,因为Integer是一个Object。因此,当您尝试插入空值时,即使使用DEFAULT 0,JPA也会将null设置为myAttribute,查询应为:

INSERT INTO table0002 values (null);

..当你插入null时,检查演示中发生了什么:

https://rextester.com/IJUT84677

值是INSERTED!与null而不是0

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

https://rextester.com/FGASH67830

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

5.2. Default Values

可以为列分配默认值。创建新行并且没有为某些列指定值时,将使用各自的默认值填充这些列。数据操作命令也可以明确请求将列设置为其默认值,


要解决这个问题,您可以使用:

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

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

my_attribute INTEGER NOT NULL DEFAULT 0

这可能会导致violates not-null constraint所以要小心你必须在调用插入时设置一个非null的默认值,检查你尝试的是什么。

https://rextester.com/LMTTOO35342


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.