8

我在休眠中使用此代码。

@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="RightID", unique=true, nullable=false)

问题是当我删除一行时,“RightId”不会按顺序保留。我想要类似的东西,休眠应该检查 id,如果缺少某些 id 值,它必须将该值提供给“RightsId”,否则正常进行

4

3 回答 3

10

我认为hibernate中没有任何这样的选项。除了自动,您还可以尝试以下策略选项:

  1. GenerationType.TABLE - 持久性提供程序使用数据库表来管理密钥。

  2. GenerationType.SEQUENCE - 持久性提供程序使用数据库序列来生成密钥。数据库必须支持序列

  3. GenerationType.IDENTITY - 持久性提供者根据数据库生成密钥。数据库必须支持 IDENTITY 列类型。

另一点:他们可能没有提供这样的选项,因为它也会降低性能。对于每个插入,它必须搜索整个ID列。你可以想象它会对性能产生多大的影响。

于 2012-06-01T17:39:32.407 回答
5

数据库不关心序列中是否存在漏洞。此外,一般来说,更改应用程序设计是可能的并且很可能更容易,这样它就不会期望 id 值列表不包含漏洞。

如果一些奇怪的原因迫使这样的设计,你必须使用自定义生成器。实现细节可以通过这个问题找到:Hibernate ID Generator

于 2012-06-01T17:33:51.753 回答
0

内部不支持此功能的主要原因是安全性。让我给你举个例子,

1. 安全

我们有一个具有唯一标识号的移动 SIM 卡数据库。如果您的 SIM 卡丢失,然后您将其停用。但是,假设其他用户购买了一个新的 sim 卡,并且该 sim 卡给出了您的 sim 卡拥有的旧唯一编号(根据您的逻辑)。那么它可能会导致一个问题。就像假设新用户做了一些恐怖行为,然后警察会追踪那个 sim 号码并可能会来找你。(因为他是新用户,有些地方 sim 仍然只显示你的名字)......

2. 延迟

肯定存在性能问题。每次查找未使用序列号的搜索都将是O(n)而不是直接的O(1)

于 2017-09-02T12:24:05.913 回答