GeneratedValue Postgres里(GeneratedValue in Postgre

2019-07-02 18:56发布

我有我的实体类映射象下面这样:

@Entity
@Audited
@Table(name="messages_locale")
public class Locale {

    @Id
    @GeneratedValue
    @Getter @Setter //Project Lombok's annotations, equal to generated getter and setter method
    private int id;
        (...)

我创造洁净新的数据库和属性:

<丙键= “hibernate.hbm2ddl.auto”>创建</丙>

凭啥(对不起,浪费了这个bug近两天)创建的数据库之后,我在我的Postgres的数据库序列?:

CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

我不希望有一个序列,我想刚才自动增量自动生成的值..

Answer 1:

在PostgreSQL自动递增使用处理SERIAL伪类型。 当你执行你使用这种类型的CREATE TABLE

现在给点意见-这SERIAL伪类型创建一个序列。 自动增量在PostgreSQL是用形成的排列处理。 该默认值id列成为- nextval('your_sequence_name')

在Hibernate中为User实体:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "users_seq_gen")
@SequenceGenerator(name = "users_seq_gen", sequenceName = "users_id_seq")
public Long getId() {
     return id;
}

在这里阅读:

http://www.postgresql.org/docs/8.4/static/datatype-numeric.html#DATATYPE-SERIAL

http://www.neilconway.org/docs/sequences/



Answer 2:

我觉得从斯托接受的答案是不正确的,或不正确的任何更长的时间。 自动递增Postgres里是通过处理SERIAL伪类型,这是正确的。 然而,映射该斯托给出将导致由Hibernate 5.1生成以下DDL:

CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;

CREATE TABLE … (
    id INT8 NOT NULL,
    …
);

这可不是用SERIAL ,但一个Hibernate管理序列。 它不是由表拥有和没有默认值已设置。 当然,DDL生成是一种功能,很多人都不在生产中使用(但多以生成的代码为模板)。

如果你手工编写DDL和实际使用SERIAL ,然后使用GenerationType.SEQUENCE与数据库的行为可能甚至冲突。 映射休眠与Postgres的优选ID策略正确的方法是使用GenerationType.IDENTITY 。 顺便提及,代码也更短,更易读的:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;


文章来源: GeneratedValue in Postgres