【问题标题】:Backup and recover database with Hibernate使用 Hibernate 备份和恢复数据库
【发布时间】:2019-10-26 08:04:18
【问题描述】:

我希望能够通过 Hibernate 备份和恢复数据库。

流程是:

1) 将每个表中的所有实体获取到 HashMap 并将整个映射序列化到文件。

2) 从数据库中清除所有实体。

3) 反序列化文件并将所有实体持久化回数据库。

在第 3 步中,我面对的是:

javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [*.*.entities.User#1]

这段代码会发生这种情况:

session.saveOrUpdate(entity);
session.getTransaction().commit(); // <- here

我所有的实体都扩展了 BasicEntity,它只有这个 ID 定义:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

我做错了什么?我认为,我无法保存实体(从文件中恢复),它有一些 ID,但我需要保存当前 ID(以保持实体之间的链接),但休眠不会让我这样做。

感谢您的任何回答。

【问题讨论】:

  • 也许问题是described here。由于这不是事务问题,因此它与or unsaved-value mapping was incorrect 部分有关。不过,我宁愿依靠数据库机制进行备份和恢复。

标签: java database hibernate jakarta-ee database-backups


【解决方案1】:

看起来像在当前提交之前在 db 中更新了另一个线程。 尝试以下选项之一

//check if it's in the cache, if it's then refresh and then saveorupdate
if (session.contains(entity) session.refresh(entity);
saveOrUpdate(entity);

//Load the object from the database and then update
dbEntity= session.load(classname.class, 2);
saveOrUpdate(dbEntity);

【讨论】:

  • 不,这不是问题所在。一切都发生在一个线程中。实体不再存在于数据库中。我已将它们从文件中恢复为具有删除前 id 的 java 实例,现在我需要再次将它们保存回来。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
相关资源
最近更新 更多