我有一个包含以下架构和序列的现有数据库:
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;
我的@Entity
映射使用了序列:
@Id
@GeneratedValue(generator = "my_seq")
@SequenceGenerator(name = "my_seq", sequenceName = "my_seq")
private Long id;
从hibernate-5
开始,我正在使用以下属性:
hibernate.id.new_generator_mappings=true
结果:当我创建新实体时,会获得以下ID:500744
。
哪个是<启动SEQUENCE,并且已存在于我的postgres
数据库中!
为什么?
答案 0 :(得分:0)
使用hibernate.id.new_generator_mappings = true
时,默认情况下,hibernate会创建一个INCREMENT 50
的序列。
如上所述here,生成的ID将为SEQ-49
。这与使用hibernate<生成的现有数据库产生冲突。 5。
解决方案:将现有序列生成器的allocationSize
限制为1:
@SequenceGenerator(.., allocationSize = 1)
答案 1 :(得分:0)
正确的注释应该是:
@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>
更新以更新数据库或创建以删除所有并再次创建(表和序列)