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

如何在Hibernate中重新生成已删除的序列号?

阎嘉荣
2023-03-14

正如我们所知,下面的hibernate注释每次从1开始的序列生成一个新的数字。考虑一种情况,其中我有一组ID为(1-5)的记录。现在,将从id为3的表中删除一条记录。如果我们看到序列1-5中的数字3由于操作而丢失。当我将在表中添加新记录时,我要求序列重新生成并重新分配数字3。如何做到这一点?

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

共有2个答案

戈念
2023-03-14

我同意尼古拉斯的观点,但我想澄清一下。

您使用的是“身份”而不是“序列”,它们之间存在一些差异,以及如何声明和使用(每个数据库都可以有自己的专业实现)。

序列是数据库中具有某些属性(如开始、结束、增量等)的独立对象标识是列的“属性”,它取决于数据库如何处理它。

在序列的情况下(取决于某些身份中的数据库),您可以创建“循环”序列以在循环结束后重复数字。但永远不会有序列或身份扫描id中的“间隙”。(正如尼古拉斯所说,这对表现非常不利)

但是根据您的代码的工作方式,您可以在序列中创建一个循环,以防止始终增加值。但是只有您确定插入新记录时不会发生冲突。

卞经业
2023-03-14

我认为这不是一个好主意。一个序列只是一个每次递增1的数字。这使其速度更快,但这已经成为分布式数据库写入的瓶颈,因为所有节点都需要在该数字上同步。

如果您试图获取第一个可用的整数,基本上需要进行全表扫描,按id对记录排序,并检查第一个缺失的整数。这是非常昂贵和低效的东西,应该尽可能便宜。

您应该将id视为没有功能意义的技术id,因此不必关心序列中是否有漏洞。

编辑:我还想补充一点,其影响会更深入,即使是在商业方面。

如果我为我以商人身份出售的物品获取ID,并将其删除建模为删除记录,或者更好地在其上添加一个状态“已删除”,可能带有删除日期和原因,那么我就更容易记账了。事实上,我更喜欢最后一种设计:保持记录,拥有一种动态的、潜在的历史状态。如果我再次出售,该物品可能会在1年内无法使用,并再次使用。

相反,如果我悄悄地重用ID,那么我的系统可能会显示一张包含新文章数据的旧账单。它可能会变成PS5或1公斤大米,而不是我不再卖的滑雪靴。这很容易出错。

当然,这可能不适用于所有业务案例,但在进行删除数据的设计之前,最好考虑这种用法。

 类似资料:
  • 我使用以下命令创建了一个名为hibernate_sequence的序列 这是我的hibernate注释dao 为了向表中插入新记录,hibernate正在生成错误的查询以获取下一个序列值。。Hibernate总是发出此查询。。不管我做什么。。 我使用的是oracle 10G,它总是报告以下错误。。 发出的查询应该是

  • 有没有可能以新的顺序生成一个已经存在的列表(例如,用名字填充)? 因此,列表填充如下: 现在列表中的第一个是“Player0”。 现在是否可以使用新的随机数开始此列表?所以就像下面的例子: 变成 因此,列表的顺序应该保持不变,只应更改列表中的第一个(当然还有所有后续的) 我希望你明白我的意思。

  • 问题内容: 我在mysql表中有一个名为“ id”的列,这也是自动递增的主键。 当我删除行时,其ID也会被删除,从而在我的ID序列中产生“空洞”,例如 1、2、3、9、10、30等 有没有办法重复使用这些已删除的ID:S? 问题答案: 使用: …将根据表中现有的最高现有值将auto_increment值重置为下一个。这意味着它不能用于校正多个间隙。 这样做的唯一原因是为了美观的记录-数据库不在乎记

  • 问题内容: 我在Hibernate中有标准协会。更新时,我正在创建新实体(使用关键字),并用必要的值(还插入ID)填充它。值来自UI。以相同的方式,我创建了子对象的新集合,用值(也插入了ID)填充每个子对象,并将集合存储在父对象中(使用setter或按方法)。 所以我的问题是:如何在更新父级时删除父级集合中的所有对象,并用新的集合替换它们。在新集合中,某些对象确实是新对象,而某些对象仅需要更新(它

  • 问题内容: 首先让我们忘记hibernate。假设我有两个表A和B。两个事务正在更新这两个表中的相同记录,但是txn 1更新B然后A,而txn 2更新A然后B。这是一个典型的死锁示例。避免这种情况的最常见方法是预先定义获取资源的顺序。例如,我们应该先更新表A然后再更新表B。 回到hibernate状态。当我们在一个会话中更新大量实体时,一旦刷新会话,对不同实体的更改将为数据库生成相应的插入/更新/

  • 让我们先忘记Hibernate。假设我有两张表,一张 回去冬眠吧。当我们在一个会话中更新大量实体时,一旦我刷新会话,不同实体的更改将会向数据库生成相应的插入/更新/删除语句。Hibernate有什么算法来决定实体之间的更新顺序吗?如果不是,Hibernate用来防止第一段描述的死锁情况的方法是什么? 如果Hibernate正在维持订单,我如何知道或控制订单?我不希望我在数据库中的显式更新与Hibe