Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用hibernate支持的JPA2创建序列_Hibernate_Jpa_Playframework - Fatal编程技术网

使用hibernate支持的JPA2创建序列

使用hibernate支持的JPA2创建序列,hibernate,jpa,playframework,Hibernate,Jpa,Playframework,我需要能够得到一个序列号(我不介意生成中是否有漏洞),我认为SQL序列将是这方面的完美匹配 我正在使用Play框架,它使用由hibernate支持的JPA2 我现在的问题是,我似乎无法让Hibernate在应用程序启动时生成序列作为自动ddl更新的一部分 我能找到的关于使用@SequenceGenerator的所有文档似乎都与实体Id相关,而不是如何定义独立于实体Id所用序列的序列 谢谢 编辑:为了给这个问题提供更多的上下文,我正在做的是实现一个保持高分的服务,当玩家第一次开始游戏时,它会要求服

我需要能够得到一个序列号(我不介意生成中是否有漏洞),我认为SQL序列将是这方面的完美匹配

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

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

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

谢谢

编辑:为了给这个问题提供更多的上下文,我正在做的是实现一个保持高分的服务,当玩家第一次开始游戏时,它会要求服务器提供一个来宾帐户

来宾帐户的用户名形式为player+number,如“player123123”,其中的数字将根据我尝试使用的序列生成

当用户注册时,他将能够将用户名更改为自定义的,但不能以player+任何形式,这样名称空间player+号码就可以自由地用于来宾帐户

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

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

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

要记住以下几点:

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

当您扩展
模型时,Play会自动向类中添加一个数字
id

如果您不介意间隙,只需要数字序列,我建议使用
id
Play提供的作为序列参考


注意:我在这里假设您希望该序列链接到一个可能包含更多数据的实体。如果不是这样,这可能不起作用。

IMHO,自动ddl更新在启动快速脏项目时非常有用。一旦它成熟,您应该在启动应用程序之前使用SQL脚本自动创建架构。请将此这个脚本中的序列创建指令。现在我正处于项目的快速和肮脏阶段,所以我现在不想手动维护额外的SQL脚本,当它投入生产时,我会这样做。在数据库中明确创建序列。Hibernate不会知道,所以它会自动生成DDL不会删除它。目前,我在大多数测试和开发中都使用内存中的db。然后在启动时打开与数据库的JDBC连接,自己创建序列。我不能只使用生成的Id,因为要获得该值,我需要先保存实体,但问题是我想使用序列来保存为一个必须是唯一的字段生成数据。因此,为了保存实体,我已经需要知道一个唯一的字符串作为该字段的数据,我可以使用uuid或类似的东西来保存,然后在我获得id后,用根据id计算的值替换该值,但如果这很复杂,很难理解我为什么这么做读取代码时。@Ruben如果字段仅基于id获取其数据,请在实体的“保存”方法中生成字段数据,您将获得id。我使用的是PostgreSQL,因此支持不成问题。我需要的是与此实体关联的第二个序列,不是用于生成id的序列,而是另一个序列。