jpa 对象值不通过Hibernate保存到数据库

r3i60tvu  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(88)

我正在做一个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。这肯定不是手动完成的,现在我只是想弄清楚为什么这个脚本会自动运行。

qyswt5oh

qyswt5oh1#

我找到了问题的根源。我仍然不太明白为什么这是一个问题,但我至少找到了解决问题的方法。
基本上,被调用来保存frequencyQty的API端点正在接收一个JSON节点,该节点Map到包含frequencyQty字段的对象。在代码中,我将JSON节点转换为对象,设置frequencyQty,并将其保存到数据库。由于某种原因,在代码运行结束后,存在自动调用数据库来保存通过该JSON节点传递到API端点的 old 值的东西,我仍然不明白为什么会自动发生这种情况,但一旦我追溯到这一点,我就改变了发送到API的逻辑。
我已经花了20多个小时试图找出这个bug。我仍然很困惑为什么它会存在,但现在,我接受修复并继续我的生活。

相关问题