Java 如何在hibernate-5中使用自定义表序列?

Java 如何在hibernate-5中使用自定义表序列?,java,hibernate,Java,Hibernate,我有一个具有以下模式和顺序的现有数据库: CREATE TABLE public.my_table ( id bigint NOT NULL, ... CONSTRAINT travelit_hotels_pkey PRIMARY KEY (id) ); CREATE SEQUENCE public.my_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 500791 CACHE 1;

我有一个具有以下模式和顺序的现有数据库:

CREATE TABLE public.my_table
(
  id bigint NOT NULL,
  ...
  CONSTRAINT travelit_hotels_pkey PRIMARY KEY (id)
);

CREATE SEQUENCE public.my_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 500791
  CACHE 1;
@Id
@GeneratedValue(generator = "my_seq")
@SequenceGenerator(name = "my_seq", sequenceName = "my_seq")
private Long id;
我的
@Entity
映射使用序列:

CREATE TABLE public.my_table
(
  id bigint NOT NULL,
  ...
  CONSTRAINT travelit_hotels_pkey PRIMARY KEY (id)
);

CREATE SEQUENCE public.my_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 500791
  CACHE 1;
@Id
@GeneratedValue(generator = "my_seq")
@SequenceGenerator(name = "my_seq", sequenceName = "my_seq")
private Long id;
hibernate-5
开始,我正在使用以下属性:
hibernate.id.new\u generator\u mappings=true

结果:当我创建一个新实体时,它将获得分配的以下id:
500744

这是序列的开始,并且已经存在于我的
postgres
DB


为什么?

当使用
hibernate.id.new\u generator\u mappings=true
时,默认情况下,hibernate将创建一个增量为50的序列

如上所述,生成的id随后将是
SEQ-49
。这会与hibernate<5生成的现有数据库产生冲突

解决方案:将现有序列生成器的
allocationSize
限制为1:
@SequenceGenerator(..,allocationSize=1)

使用
hibernate.id.new\u generator\u mappings=true
时,hibernate将默认创建增量为50的序列

如上所述,生成的id随后将是
SEQ-49
。这会与hibernate<5生成的现有数据库产生冲突

解决方案:将现有序列生成器的
allocationSize
限制为1:
@SequenceGenerator(..,allocationSize=1)
正确的注释应该是:

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="my_generator")
@SequenceGenerator(name="my_generator", sequenceName="my_seq", allocationSize=1, initialValue=1)
若您只是在数据库上设置了序列,那个么hibernate不会覆盖它。要更改顺序,可以从数据库中删除,并在hibernate.cfg.xml中进行更改

<property name="hibernate.hbm2ddl.auto">update</property>
更新

更新以更新数据库或创建以删除所有内容并再次创建(表和序列)

正确的注释应为:

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="my_generator")
@SequenceGenerator(name="my_generator", sequenceName="my_seq", allocationSize=1, initialValue=1)
若您只是在数据库上设置了序列,那个么hibernate不会覆盖它。要更改顺序,可以从数据库中删除,并在hibernate.cfg.xml中进行更改

<property name="hibernate.hbm2ddl.auto">update</property>
更新

更新以更新数据库或创建以删除所有并再次创建(表和序列)

here,wasnt helpfull?here,wasnt helpfull?
strategy=SEQUENCE
initialValue=1
是默认值。无需显式添加它们。
strategy=SEQUENCE
initialValue=1
是默认值。不需要显式地添加它们。