Hibernate生成值策略

8

我在使用hibernate框架时遇到了以下代码。

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

问题是当我删除一行时,“RightId”不会保持顺序。我希望有一种方法,让Hibernate检查ID,如果有某个ID值缺失,则必须将该值赋给“RightsId”,否则继续正常进行。
3个回答

10

我认为在Hibernate中没有这样的选项可用。 除了AUTO之外,您还可以尝试以下几种策略选项:

  1. GenerationType.TABLE - 持久性提供者使用数据库表来管理键。

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

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

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


5
数据库不在乎序列中是否有空缺。通常来说,更容易改变应用程序设计,使其不期望ID值列表中没有空洞。
如果某种奇怪的原因迫使采用这种设计,则必须使用自定义生成器。实现细节可通过此问题找到:Hibernate ID Generator

0

这个不被内部支持的主要原因是安全。让我举个例子,

1. 安全

我们有一个用于移动Sim卡的数据库,其中包含唯一的识别号码。如果你的sim卡丢失并被停用,但假设其他用户购买了新的sim卡,并且该sim卡获得了你的sim卡曾经拥有的旧唯一号码(按照你的逻辑)。那么可能会导致问题。比如说,假设那个新用户做了一些恐怖行为,警察会追踪那个sim卡号码,并可能找到你。(因为他是新用户,在某些地方sim卡仍然只显示你的名字)...

2. 延迟

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接