【问题标题】:Hibernate Generated Value strategyHibernate 生成值策略
【发布时间】:2012-06-06 22:51:27
【问题描述】:

我在休眠中使用此代码。

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

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

【问题讨论】:

    标签: java sql hibernate hql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为休眠中没有任何此类选项可用。 除了自动,您还可以尝试以下策略选项:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        1.安全

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

        2。延迟

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-09
          • 1970-01-01
          • 2014-05-28
          • 2012-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-19
          相关资源
          最近更新 更多