使用由Flyway在JPA中创建的序列

时间:2018-10-29 12:42:59

标签: postgresql spring-boot jpa flyway

我正在使用Spring Boot 2 / Flyway / Postgres设置。

我想实现让Flyway创建具有序列的表的功能,以进行自动键迭代。 JPA应该识别序列并使用它。

我让Flyway执行PostgreSQL脚本:

CREATE SEQUENCE config_id_seq;

CREATE TABLE config
(
    ID          BIGINT NOT NULL PRIMARY KEY DEFAULT nextval('config_id_seq'),
    DESCRIPTION VARCHAR(500)
);

这是实体定义:

@Entity
@Table(name = "config")
public class Config {

    @Id
    @SequenceGenerator(name = "config_id_sequence", sequenceName = "config_id_seq")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "config_id_sequence")
    @Column(name = "id")
    private long id;

    @Column(name = "description")
    private String description;

在启动时会引发以下错误:

Caused by: org.postgresql.util.PSQLException: ERROR: relation "config_id_seq" already exists
Caused by: org.postgresql.util.PSQLException: ERROR: cannot change sequence "config_id_seq"

我的解释是Flyway成功执行了脚本并创建了一个序列。但是JPA想要在以后创建序列,但是失败了,因为它已经存在。如果我错了,请纠正我。

现在,如果可能的话,如何配置JPA以重用现有序列?

1 个答案:

答案 0 :(得分:0)

我们需要将 spring.jpa.hibernate.ddl-auto 属性设置为none,否则您可以跳过此属性,以便spring不会自己创建数据库对象。

如果我们使用的是flyway,则应该将创建数据库对象的责任仅交给flyway,即仅使用flyway脚本(如表和序列)创建所有数据库对象。

Specifyd GeneratedValue表示JPA使用序列,本身检索下一个值,然后在INSERT中使用它。

但是请确保您具有与实体类和flyway脚本中提到的相同的配置。