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
是默认值。不需要显式地添加它们。