我在使用hibernate框架时遇到了以下代码。
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="RightID", unique=true, nullable=false)
问题是当我删除一行时,“RightId”不会保持顺序。我希望有一种方法,让Hibernate检查ID,如果有某个ID值缺失,则必须将该值赋给“RightsId”,否则继续正常进行。
我认为在Hibernate中没有这样的选项可用。 除了AUTO之外,您还可以尝试以下几种策略选项:
GenerationType.TABLE - 持久性提供者使用数据库表来管理键。
GenerationType.SEQUENCE - 持久性提供者使用数据库序列进行密钥生成。数据库必须支持序列。
GenerationType.IDENTITY - 持久性提供者推迟到数据库进行密钥生成。数据库必须支持IDENTITY列类型。
另一个观点是:他们可能没有提供这样的选项,因为它也会降低性能。对于每个插入操作,都必须搜索整个ID列。您可以想象它将对性能产生多大影响。
这个不被内部支持的主要原因是安全。让我举个例子,
1. 安全
我们有一个用于移动Sim卡的数据库,其中包含唯一的识别号码。如果你的sim卡丢失并被停用,但假设其他用户购买了新的sim卡,并且该sim卡获得了你的sim卡曾经拥有的旧唯一号码(按照你的逻辑)。那么可能会导致问题。比如说,假设那个新用户做了一些恐怖行为,警察会追踪那个sim卡号码,并可能找到你。(因为他是新用户,在某些地方sim卡仍然只显示你的名字)...
2. 延迟
而且肯定存在性能问题。每次搜索未使用的序列号将是O(n),而不是直接的O(1)。