我正在使用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以重用现有序列?
答案 0 :(得分:0)
我们需要将 spring.jpa.hibernate.ddl-auto 属性设置为none,否则您可以跳过此属性,以便spring不会自己创建数据库对象。
如果我们使用的是flyway,则应该将创建数据库对象的责任仅交给flyway,即仅使用flyway脚本(如表和序列)创建所有数据库对象。
Specifyd GeneratedValue表示JPA使用序列,本身检索下一个值,然后在INSERT中使用它。
但是请确保您具有与实体类和flyway脚本中提到的相同的配置。