我需要在数据库中以偏移量开头的所有表中都有一个唯一的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。
有没有人遇到过这个问题?
提前致谢。
答案 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;
表策略显然更具可移植性,因此请考虑选择何时进行选择。