2012-02-08 18 views
2

我需要能够获得一个序列号(我不介意这一代中是否有漏洞),我认为一个SQL序列将是完美匹配。用休眠支持的JPA2创建一个序列

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

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

关于使用@SequenceGenerator的每条文档似乎都与实体标识相关,而不是如何定义独立于实体标识的序列。

谢谢。

编辑:只是为了给这个问题更多的上下文,我正在做的是实施一项服务,以保持高分,第一次玩家开始游戏,它会问服务器的访客帐户。

访客帐户的用户名采用播放器+数字形式,如“player123123”,其中数字将从我尝试使用的序列中生成。

当用户注册时,他可以将用户名更改为自定义的用户名,但不能以玩家+任何形式进行更改,以便名称空间玩家+号码可以免费用于访客帐户。编辑2:现在我通过定义一个永远不会被使用的额外的无用实体,并使用来自该实体的序列,但它是一个丑陋的黑客攻击。

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

+0

恕我直言,自动ddl更新是很有用的,当启动一个快速n'肮脏的项目。一旦成熟,您应该拥有SQL脚本来在启动应用程序之前自动创建模式。把这个序列创建指令放在这个脚本中。 – 2012-02-08 08:19:36

+0

现在我处于项目的快速和肮脏的阶段,所以我现在不想手动维护额外的SQL脚本,现在是时候把它投入生产了,我会这样做。 – 2012-02-08 15:52:14

+0

在数据库中明确创建序列。 Hibernate不会知道它,所以它的自动DDL生成不会删除它。 – 2012-02-08 17:06:13

回答

1

序列发生器(使用@SequenceGenerator定义)应是整个持久化单元唯一的,所以你可以重新使用它们。 This question处理此(或多或少)特定问题。

几件事情要记住:

  • 序列并非所有数据库厂商的支持,我相信Oracle和PostgreSQL的支持他们,但我不知道其他人
  • 序列发生器可对实体定义,所以你不能用一个@MappedSuperclass
  • 播放框架将自动添加和ID领域的实体,如果你扩展Model,所以记住这一点在如果您想覆盖该行为
+0

我正在使用PostgreSQL,所以支持不应该是一个问题。 我需要的是与此实体关联的第二个序列,而不是用于生成ID的另一个序列。 – 2012-02-08 15:57:34

0

当您延长Model时,Play会自动向该课程添加数字id

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

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

+0

我不能只使用生成的Id,因为要获取该值,我需要先保存实体,但问题是我想使用序列为必须唯一的字段生成数据。所以为了保存实体我已经需要知道一个唯一的字符串作为该字段的数据,我可以使用一个uuid或类似的东西来保存,然后在我得到id后,将值替换为从该ID,但如果是复杂的,难以理解为什么我在阅读代码时这样做。 – 2012-02-08 15:57:01

+0

@Ruben如果该字段仅根据id获取其数据,则在该实体的“save”方法中为该字段生成数据,在该数据中您将拥有该id ... – 2012-02-08 16:11:06