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

时间:2016-08-09 10:22:22

标签: 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;

我的@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数据库中!

为什么?

2 个答案:

答案 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>

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