在我的数据库表中,我有一个属性的默认值,例如
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
设置为myAttribute
DEFAULT 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)。