【问题标题】:Create a Sequence using JPA2 backed by hibernate使用由 hibernate 支持的 JPA2 创建序列
【发布时间】:2012-02-08 01:26:51
【问题描述】:

我需要能够获得一个序列号(我不介意这代是否有漏洞),我认为 SQL 序列将是完美的匹配。

我正在使用 Play 框架,它使用由 hibernate 支持的 JPA2。

我现在的问题是,我似乎无法让 Hibernate 生成序列作为应用程序启动时自动 ddl 更新的一部分。

我能找到的关于使用 @SequenceGenerator 的每个文档似乎都与实体 ID 相关,而不是如何定义一个独立于用于实体 ID 的序列。

谢谢。

编辑:只是为了给这个问题提供更多背景信息,我正在做的是实现一个保持高分的服务,当玩家第一次开始游戏时,它会向服务器询问访客帐户。

来宾帐户的用户名形式为玩家 + 号码,例如“player123123”,其中号码将根据我尝试使用的顺序生成。

当用户注册时,他将能够将用户名更改为自定义的,但不是以玩家 + 任何形式的形式,因此名称空间玩家 + 号码仍然可以免费用于访客帐户。

EDIT2:现在我通过定义一个永远不会使用的额外无用实体来使其工作,并且只使用该实体中的序列,但它是一个丑陋的黑客。

忽略针对我的具体问题的可能解决方案(黑客攻击),我想知道 hibernate 和 jpa2 是否可以声明与实体关联或独立于任何实体的额外(不是用于 id 生成的)序列和让休眠自动在数据库中创建它们。

【问题讨论】:

  • 恕我直言,自动 ddl 更新在启动快速 n' 脏项目时很有用。成熟后,您应该拥有 SQL 脚本来在启动应用程序之前自动创建模式。将此序列创建指令放入此脚本中。
  • 现在我正处于项目的快速而肮脏的阶段,所以我现在不想手动维护额外的 SQL 脚本,当是时候将它投入生产时我会这样。
  • 在数据库中显式创建序列。 Hibernate 不会知道它,所以它的自动 DDL 生成不会删除它。
  • 此时,我正在使用内存数据库进行大多数测试和开发。
  • 然后在启动时打开到数据库的JDBC连接,自己创建序列。

标签: hibernate jpa playframework


【解决方案1】:

序列生成器(使用@SequenceGenerator 定义)应该在整个持久性单元中是唯一的,因此您可以重复使用它们。 This question 处理这个(或多或少)具体问题。

需要注意的几点:

  • 并非所有数据库供应商都支持序列,我相信 Oracle 和 PostgreSQL 支持它们,但我不确定其他的
  • 序列生成器只能在实体上定义,因此您不能使用@MappedSuperclass
  • 如果您扩展 Model,Play 框架将自动向您的实体添加 ID 字段,因此请记住这一点,以防您想要覆盖该行为

【讨论】:

  • 我使用的是 PostgreSQL,所以支持应该不是问题。我需要的是与该实体关联的第二个序列,不是用于生成 ID 的序列,而是另一个序列。
【解决方案2】:

当您扩展 Model 时,Play 会自动将数字 id 添加到类中。

鉴于您不介意空格并且您只需要数字序列,我建议使用 id Play 提供的作为您序列的参考。

注意:我在这里假设您希望将该序列链接到可能包含更多数据的实体。如果不是这种情况,这可能行不通。

【讨论】:

  • 我不能只使用生成的 Id,因为要获得该值,我需要先保存实体,但问题是我想使用序列生成数据必须是唯一的字段。因此,为了保存实体,我已经需要知道一个唯一的字符串用作该字段的数据,我可以使用 uuid 或类似的东西来保存,然后在我得到 id 后用计算的值替换值id 但是 if 很复杂,很难理解为什么我在阅读代码时会这样做。
  • @Ruben 如果字段仅根据 id 获取数据,则在实体的“保存”方法上为字段生成数据,您将在其中获得 id...跨度>
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 2018-11-05
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2021-01-20
相关资源
最近更新 更多