Hibernate忽略序列生成器的initialValue

时间:2017-02-01 17:55:51

标签: java mysql hibernate jpa

我需要在数据库中以偏移量开头的所有表中都有一个唯一的ID,比方说1000.下面的ID是为Java代码中的常量引用的特殊记录保留的。换句话说,第一个记录持久存在于任何表中,我希望其具有ID 1000,下一个1001等。

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

iter

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

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

我也尝试过使用TABLE策略,但这种策略也不起作用。 ID以1开头。

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

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

有没有人遇到过这个问题?

提前致谢。

2 个答案:

答案 0 :(得分:2)

生成器名称必须包含在@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)

答案 1 :(得分:0)

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

<强>序列

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

表格

ID生成表应该有两列。第一列是String类型,用于标识特定的生成器序列。它是表中所有生成器的主键。第二列是整数类型,用于存储正在生成的实际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;

表策略显然更具可移植性,因此请考虑选择何时进行选择。