我有一个Spring应用程序,其中域对象标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到域对象中的。保存域对象(Insert)后,尝试使用相同标识符(更新)保存域对象时,将收到以下错误
原因: org.springframework.dao.IncorrectUpdateSemanticsDataAccessException:未能更新实体com.example.UUIDTest.DomainObjectLongId@77ccded4.在数据库中找不到Id 2997744842191684912。
我已经创建了几个测试示例。在DomainObject示例中,我以UUID的形式生成ID。在DomainObjectLongId示例中,我将ID作为一个Long生成。在这两个示例中,当使用Spring存储库时,它都会在保存(Update)上失败。手动生成SQL并使用它成功地进行更新。
我已经创建了一个让DB自动生成ID的测试示例。在这种情况下,在保存(Update)时,它会成功,不会出现任何错误。
如何让使用提供的id更新域对象?
下面是包含所有3个测试类的Github存储库。其中两个已提供标识符的保存(更新)失败,一个使用自动生成的标识符成功保存(更新)。
发布于 2021-11-10 16:10:32
终于弄明白了。我总是更改DomainObject的ID
aggregate.setId(UUID.randomUUID());
return aggregate;我需要检查它是否需要设置
if (aggregate.getId() == null) {
aggregate.setId(UUID.randomUUID());
}
return aggregate;https://stackoverflow.com/questions/69908728
复制相似问题