使用由hibernate支持的JPA2创建一个序列

时间:2012-02-08 01:26:52

标签: hibernate jpa playframework

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

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

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

我可以找到关于使用@SequenceGenerator的每个文档似乎与实体ID相关,而不是如何定义与用于实体id的序列无关的序列。

感谢。

编辑:为了给出更多关于问题的背景信息,我正在做的是实现一项保持高分的服务,玩家第一次启动游戏时会向服务器请求访客帐户。

访客帐户有一个玩家+号码形式的用户名,如“player123123”,其中号码将从我尝试使用的序列中生成。

当用户注册时,他可以将用户名更改为自定义内容,但不能以播放器+任何形式更改,以便命名空间播放器+号码可以免费用于访客帐户。

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

忽略我的具体问题的可能解决方案(hacks),我想知道是否可以使用hibernate和jpa2声明额外的(不是用于id生成的那个)序列与实体相关或独立于任何实体和让hibernate自动在db中创建它们。

2 个答案:

答案 0 :(得分:1)

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

要记住以下几点:

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

答案 1 :(得分:0)

在您展开id时,Play会自动为该类添加数字Model

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

注意:我在这里假设您希望该序列链接到可能包含更多数据的实体。如果情况并非如此,这可能无效。