10

我的实体类映射如下:

@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;
        (...)

我创建干净的新数据库和属性:

<prop key="hibernate.hbm2ddl.auto" >创建</prop>

为什么在创建数据库后,我在我的 postgres 数据库中有一个序列?:

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

我不想有一个序列,我只想自动递增自动生成的值..

4

2 回答 2

27

我认为 Petar 接受的答案不正确,或者不再正确。Postgres 中的自增是通过SERIAL伪类型处理的,没错。但是,Petar 提供的映射将导致 Hibernate 5.1 生成以下 DDL:

CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;

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

这不是 using SERIAL,而是一个 Hibernate 托管序列。它不属于该表,并且未设置默认值。当然,DDL 生成是很多人在生产中不使用的特性(但很多人以生成的代码为模板)。

如果您手写 DDL 并实际使用SERIAL,那么 usingGenerationType.SEQUENCE甚至可能与数据库行为发生冲突。使用 Postgres 的首选 ID 策略映射 Hibernate 的正确方法是使用GenerationType.IDENTITY. 顺便说一句,代码也更短且更具可读性:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
于 2017-02-13T08:56:58.577 回答
23

在 PostgreSQL 中,自动增量是使用SERIAL伪类型处理的。执行时使用此类型CREATE TABLE

现在说到重点——这个SERIAL伪类型创建了一个序列。PostgreSQL使用创建的序列处理自动增量。该id列的默认值变为 - nextval('your_sequence_name')

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/

于 2012-10-28T08:54:04.447 回答