Spring Repository save()方法未返回数据库四舍五入后的值问题咨询
结论:这不属于Bug,是ORM框架的常规行为
原因说明:
- ORM框架(比如JPA、MyBatis-Plus等)的
save()方法,默认返回的是你传入的原内存对象实例,仅会补充数据库自动生成的字段(比如示例中的自增ID),不会主动修改你传入的其他属性值。 - 你传入的
newObj中price为12.555,虽然数据库因为DECIMAL(10,2)的约束自动做了四舍五入存储为12.56,但ORM不会同步修改内存中对象的price属性。 - 如果需要获取与数据库完全一致的实体数据,你需要主动执行以下操作之一:
- 调用ORM的
refresh()方法,从数据库重新加载实体属性 - 调用
saveAndFlush()后,再通过ID重新查询该实体
- 调用ORM的
示例代码与表结构
数据表结构
CREATE TABLE OBJ( ID INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30) NOT NULL, DESCRIPTION VARCHAR(200) NOT NULL, PRICE DECIMAL(10,2) NOT NULL );
执行代码
Obj newObj = new Obj("obj name", "brief description", 12.555); repository.save(newObj); // 此时newObj的price还是12.555,需手动刷新或重新查询
内容的提问来源于stack exchange,提问作者ATLAS
相关产品推荐
相关产品推荐

