【问题标题】:How to use custom table sequence with hibernate-5?如何在 hibernate-5 中使用自定义表序列?
【发布时间】:2016-12-15 08:20:14
【问题描述】:

我有一个具有以下架构和序列的现有数据库:

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 中!

为什么?

【问题讨论】:

  • answer 在这里,没有帮助吗?

标签: java hibernate


【解决方案1】:

当使用hibernate.id.new_generator_mappings = true 时,hibernate 默认会使用INCREMENT 50 创建一个序列。

here 所述,生成的 id 将为SEQ-49。这会与使用 hibernate

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

【讨论】:

    【解决方案2】:

    正确的注释应该是:

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="my_generator")
    @SequenceGenerator(name="my_generator", sequenceName="my_seq", allocationSize=1, initialValue=1)
    

    如果你只是在数据库上有序列,休眠不要覆盖它。要更改顺序,您可以从数据库中删除并更改 hibernate.cfg.xml

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

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

    【讨论】:

    • strategy = SEQUENCEinitialValue = 1 是默认值。无需显式添加它们。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多