【问题标题】:Hibernate ignores initialValue for sequence generatorHibernate 忽略序列生成器的 initialValue
【发布时间】:2017-06-18 14:17:15
【问题描述】:

我需要在我的数据库中的所有表中都有一个唯一的 ID,该 ID 以偏移量开头,比如说 1000。低于该偏移量的 ID 是为 Java 代码中的常量引用的特殊记录保留的。换句话说,我希望任何表中持久化的第一条记录的 ID 为 1000,下一条记录为 1001,以此类推。

我按照 Hibernate 文档和各种帖子中的说明进行操作,这些是我正在使用的注释:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "my_sequence", initialValue = 1000, allocationSize = 10)
private long id;

不幸的是,Hibernate 完全忽略了 initialValue 设置。它生成以下 SQL 代码:

create table hibernate_sequence (next_val bigint)
insert into hibernate_sequence values ( 1 )

我也尝试过同样不起作用的 TABLE 策略。 ID 以 1 开头。

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@TableGenerator(name = "my_sequence", initialValue = 1000, allocationSize = 10)
private long id;

顺便说一句,这确实适用于 EclipseLink JPA 提供程序。我的 Hibernate 版本是 5.2.7,我正在使用 JPA API。我正在使用 MySQL。

有人遇到过这个问题吗?

提前致谢。

【问题讨论】:

    标签: java mysql hibernate jpa


    【解决方案1】:

    生成器名称必须包含在@GeneratedValue 注解中,如:

    @GeneratedValue(strategy = GenerationType.TABLE, generator = "my_sequence")    
    @TableGenerator(
      name = "my_sequence",
      table = "id_gen",
      pkColumnName = "gen_name",
      valueColumnName = "gen_val",
      initialValue = 1000,
      allocationSize = 10)
    

    【讨论】:

      【解决方案2】:

      我认为你错过了这两种策略的一些属性:

      序列

      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      @SequenceGenerator(name = "my_sequence", sequenceName= "dbsequence"
                         initialValue = 1000, allocationSize = 10)
      private long id;
      

      表格

      Id 生成表应该有两列。第一列是一个字符串类型,用于标识特定的生成器序列。它是表中所有生成器的主键。第二列是一个整数类型,用于存储正在生成的实际 id 序列。此列中存储的值是序列中分配的最后一个标识符。

      @Id
      @GeneratedValue(strategy = GenerationType.TABLE)
      @TableGenerator(name = "my_sequence"
                    , table = "id_gen"
                    , pkColumnName = "gen_name"
                    , valueColumnName = "gen_val"
                    , initialValue = 1000, allocationSize = 10)
      private long id;
      

      表格策略显然更便于携带,因此请考虑何时做出选择。

      【讨论】:

      • 这不会改变任何事情。 Hibernate 一直忽略注释参数,例如表名或初始值:“create table hibernate_sequences”。毕竟这些参数是可选的。
      【解决方案3】:

      你应该命名你的@sequencegenerator,然后将相同的名称添加到@generatedvalue

      您还需要创建-删除您的表(在 application.properties 中),否则您的应用程序将使用旧的序列参数运行该表

      `@Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE , name="my_sequence")
      @SequenceGenerator(name = "my_sequence",sequenceName="my_sequence", initialValue = 1000,allocationSize = 10)
       private long id;`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多