我有一个现有的数据库,它具有以下模式和序列:
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。
它是<序列的开始,并且已经存在于我的postgres DB中!
为什么?
发布于 2016-08-09 18:58:36
当使用hibernate.id.new_generator_mappings = true时,hibernate会默认使用INCREMENT 50创建一个序列。
如here所述,生成的id将是SEQ-49。这会与hibernate < 5生成的现有数据库产生冲突。
解决方案:将现有序列生成器的allocationSize限制为1:@SequenceGenerator(.., allocationSize = 1)
发布于 2016-08-09 19:47:13
正确的注解应该是:
@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>update更新数据库或create删除全部并再次创建(表和序列)
https://stackoverflow.com/questions/38848158
复制相似问题