在我的db表中,我有一个属性的默认值
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
,因为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
,因此使用默认值。文件说:
可以为列分配默认值。创建新行并且没有为某些列指定值时,将使用各自的默认值填充这些列。数据操作命令也可以明确请求将列设置为其默认值,
要解决这个问题,您可以使用:
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的默认值,检查你尝试的是什么。
我不确定。如果仅在数据库中设置默认值,则答案可以是实体的状态。我的意思是你使用会话中没有设置默认值的数据。在这种情况下,您可以使用方法flush()(EntityManager)。