当前位置: 首页 > 知识库问答 >
问题:

Spring数据JDBC保存(更新)不更新

景修杰
2023-03-14

我有一个Spring应用程序,其中Domain Object标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到Domain Object中的。保存域对象(插入)后,当尝试保存具有相同标识符的域对象(更新)时,我收到以下错误

原因:组织。springframework。道。Incorrectupdatesemanticdataaccessexception:未能更新实体[com.example.UUIDTest]。DomainObjectLongId@77ccded4].在数据库中找不到Id[29977448429161684912]。

我创建了几个测试示例。在DomainObject示例中,我将ID生成为UUID。在DomainObjectLongId示例中,我将ID生成为Long。在这两个示例中,当使用Spring数据JDBC存储库时,保存(更新)失败。手动生成SQL并使用它成功地进行更新。

我创建了一个测试示例,其中DB自动生成ID。在这种情况下,在保存(更新)时,它会成功,没有任何错误。

如何让Spring数据JDBC使用提供的id更新域对象?

下面是包含所有3个测试类的Github存储库。其中两个使用提供的标识符保存(更新)失败,其中一个使用自动生成的标识符保存(更新)成功。

Github Spring-数据-JDBC-UUID-测试

共有1个答案

姚宪
2023-03-14

终于弄明白了。我总是在更改DomainObject的ID

aggregate.setId(UUID.randomUUID());
return aggregate;

我需要检查一下是否需要设置

if (aggregate.getId() == null) {
  aggregate.setId(UUID.randomUUID());
}
return aggregate;
 类似资料:
  • 主要内容:所需步骤,示例代码在本教程将演示如何在JDBC应用程序中,更新数据库的一个表中数据记录。 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中更新数据记录。 要执行以下示例,需要用实际用户名和密码替换这里用户名()和密码()。 MySQL或数据库已启动并运行。 所需步骤 使用JDBC应用程序向表中更新数据记录需要以下步骤: 导入包:需要包含包含数据库编程所需的JDBC类的

  • 问题内容: 我正在尝试使用Hibernate插入或更新大数据。我有一个包含350k对象的列表,当我使用Hibernate时,要花费数小时才能插入所有数据。 我正在使用以下代码进行此操作。我的开发环境是JDK1.4和Oracle数据库。 我正在使用批处理更新,还设置了属性50,但这并没有帮助。 我的对象与另一个对象具有一对一的关系,因此在这种情况下使用StatelessSession可能会出现问题。

  • 我正在学习hibernate和Spring Boot(也是Thymeleaf),遇到了以下问题: 环境:我有一个表单,处理创建和更新数据基于ID参数在GET方法,如果ID等于数据库中的一行,那么更新,否则保存。ID存储在隐藏的输入标记中,并与表单数据一起插入到实体对象中。然后将该对象发送给一个服务,该服务调用DAO来使用saveOrUpdate()方法保存或更新数据。 问题总结:在我的服务中,我有

  • 所以如果我对一个已经注册的条目调用那个方法,如果它发现一个改变了的属性,它就会更新它? 多谢了。

  • 出于某种原因,当这个JTable被调用时,它没有任何变化(这个方法在用户提交SQL查询后更新JTable)。 给定:验证数据向量和列名称向量是否正确填充。JTable 是一个私有类变量。 有什么想法吗?

  • 无论如何,如果用户名已经被使用,存储库只需进行更新,因为指定的标识符不是空的。这不是我想要的行为,我需要它抛出类似重复条目异常的东西。有什么办法可以预防吗?我必须自己做吗?例如: