Hibernate生成的价值策略

时间:2012-06-01 17:12:35

标签: java sql hibernate hql

我在hibernate中使用此代码。

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

问题是当我删除一行' RightId'不要按顺序排列。我想要类似的东西,hibernates应该检查id,如果缺少一些id值,它必须将该值赋予' RightsId'否则正常进行

3 个答案:

答案 0 :(得分:10)

我认为hibernate中没有这样的选项。 您也可以尝试以下策略选项而不是AUTO:

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

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

  3. GenerationType.IDENTITY - 持久性提供程序遵循数据库进行密钥生成。数据库必须支持IDENTITY列类型。
  4. 另一点:他们可能没有提供这样的选择,因为它也会降低性能。对于每个插入,它必须搜索整个 ID 列。你可以想象它会对性能产生多大的影响。

答案 1 :(得分:5)

数据库不关心序列中是否有漏洞。另外一般情况下,更改应用程序设计是可能的,而且很可能更容易,因此它不希望id值列表不包含空洞。

如果有一些奇怪的原因迫使这样的设计,你必须使用自定义发电机。可以通过以下问题找到实施细节:Hibernate ID Generator

答案 2 :(得分:0)

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

<强> 1。安全

我们有一个移动SimCards数据库,它有唯一的识别号码。如果您的SIM卡丢失,然后您取消激活它。但是,让我们说其他一些用户购买了一个新的SIM卡和SIM卡给出了你的SIM卡所具有的旧的唯一编号(按照你的逻辑)。然后它可能会导致问题。就像让我们说新用户做了一些恐怖行为一样,然后警察会跟踪那个SIM号码,并且可能会来找你。(因为他是新用户,而且有些地方sim仍然只显示你的名字)......

<强> 2。延迟

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