仅使用 Spring 数据 JDBC 中的值列表的实体存在问题

Problem with an entity using just a list of values in Spring Data JDBC

我正在使用 Spring-Boot 2.5.0,Java 11,一个 Postgres 数据库和 Lombok。我有例如作为实体的文章列表:

@Data
@Builder
@AllArgsConstructor
public class Articles {

    @Id
    private Long id;


    @Builder.Default
    private List<Article> articles = new ArrayList<>();
}

文章值:

@Data
@Builder
@AllArgsConstructor
public class Article {
    private String name;
    private Integer price;
}

和存储库:

@Repository
public interface ArticlesRepository extends CrudRepository<Articles, Long> {
}

数据库模式如下所示:

CREATE TABLE "articles" (
  "id"                  BIGSERIAL  NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE "article" (
  "name"               VARCHAR(255),
  "price"              INTEGER,
  "articles"           BIGINT,
  "articles_key"       INTEGER
);

并对其进行测试:

var article1 = Article.builder().name("T-Shirt").price(1635).build();
var article2 = Article.builder().name("Shoes").price(5670).build();
var articles = Articles.builder().articles(List.of(article1, article2)).build();
articlesRepository.save(articles);

会引发异常:

Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO "articles" VALUES ()]; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"

如果我只是向 Articles 添加一个字段,例如name 在这种情况下,它工作正常:

@Data
@Builder
@AllArgsConstructor
public class Articles {

    @Id
    private Long id;

    private String name;

    @Builder.Default
    private List<Article> articles = new ArrayList<>();
}

这是某些数据库 Spring 数据 JDBC 的当前限制。

一些数据库要求插入至少有一列。

作为一种解决方法,您可以添加一个您实际不使用的虚拟列。或者,您无法自动生成 ID。

请考虑 creating an issue 以便最终解决此问题。