Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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
Java Hibernate忽略序列生成器的初始值_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

Java Hibernate忽略序列生成器的初始值

Java Hibernate忽略序列生成器的初始值,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我需要在数据库中的所有表中都有一个唯一的ID,该ID以偏移量开始,比如说1000。偏移量下面的ID是为Java代码中常量引用的特殊记录保留的。换句话说,保存在任何表中的第一条记录的ID为1000,下一条记录的ID为1001,以此类推 我遵循了Hibernate文档和各种帖子中的说明,下面是我使用的注释: @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @SequenceGenerator(name = "my_sequence",

我需要在数据库中的所有表中都有一个唯一的ID,该ID以偏移量开始,比如说1000。偏移量下面的ID是为Java代码中常量引用的特殊记录保留的。换句话说,保存在任何表中的第一条记录的ID为1000,下一条记录的ID为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 )
我还尝试了一种同样不起作用的桌面策略。ID以1开头

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@TableGenerator(name = "my_sequence", initialValue = 1000, allocationSize = 10)
private long id;
顺便说一句,EclipseLink JPA提供商确实可以这样做。我的Hibernate版本是5.2.7,我正在使用JPAAPI。我正在使用MySQL

有人遇到过这个问题吗


提前感谢。

我认为您在这两种策略上都忽略了一些特性:

序列

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

@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;

表策略显然更便携,所以考虑当你做出选择时,

生成器名称必须包含在@派生值注释中,如:

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

这不会改变任何事情。Hibernate一直忽略注释参数,例如表名或初始值:“创建表Hibernate\u序列”。这些参数毕竟是可选的。