我正在做一个Sping Boot 项目,该项目使用Hibernate与Oracle数据库交互。save
功能没有按预期工作。它只是Spring Data JPA框架的默认实现,它接受一个对象并将其保存到存储库。对象定义有一个名为frequencyQty
的字段,该字段具有以下定义:
@Column(precision=10, scale=2)
private BigDecimal frequencyQty;
...
public BigDecimal getFrequencyQty() {
return frequencyQty;
}
public void setFrequencyQty(BigDecimal frequencyQty) {
this.frequencyQty = frequencyQty;
}
字符串
精度10和小数位数2也完全匹配数据库列的定义。
问题是Hibernate没有正确地将这个字段保存到数据库中。如果数据库中的字段是null
,那么什么都不会保存。但是如果数据库中的字段已经有一个值,那么它可以保存其他值。
例如,如果数据库中的字段是null
,我尝试保存4
,它仍然是null
。如果数据库中的字段是1
,我尝试保存4
,那么它会像预期的那样保存4
。
我已经做了我能想到的一切来调试为什么会发生这种情况。这个对象的其他字段保存正常,如果存在null
值,即使它们与frequencyQty
同时保存,也会覆盖null
值。这是一个重要的细节,因为这意味着除了这一个特定字段之外,该行已正确保存到数据库。调试器将确认正确的值在调用save
功能时在frequencyQty中设置。我没有发现任何关于这个字段的特殊信息。
有人有什么想法吗?
编辑:Oracle版本为19c Standard Edition 2 Release 19.0.0.0.0
编辑:当我检查SQL日志时,似乎调用了正确的SQL来设置frequencyQty
,但后来调用了一些SQL将frequencyQty
设置回null
。这肯定不是手动完成的,现在我只是想弄清楚为什么这个脚本会自动运行。
1条答案
按热度按时间qyswt5oh1#
我找到了问题的根源。我仍然不太明白为什么这是一个问题,但我至少找到了解决问题的方法。
基本上,被调用来保存
frequencyQty
的API端点正在接收一个JSON节点,该节点Map到包含frequencyQty
字段的对象。在代码中,我将JSON节点转换为对象,设置frequencyQty
,并将其保存到数据库。由于某种原因,在代码运行结束后,存在自动调用数据库来保存通过该JSON节点传递到API端点的 old 值的东西,我仍然不明白为什么会自动发生这种情况,但一旦我追溯到这一点,我就改变了发送到API的逻辑。我已经花了20多个小时试图找出这个bug。我仍然很困惑为什么它会存在,但现在,我接受修复并继续我的生活。