保存与spring数据有一对多关系的java实体jdbc返回空列表

pgccezyw  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(485)

保存项目后返回值有问题( ArticleList )一对多关系( ArticleListEntry )在spring数据jdbc中。首次创建实体时,调用 repository.save(entity) 我的返回实体,包括所有相关项目,都正确地保存在数据库中。但是,返回的值包含 entries . 原稿上的字段 ArticleList 始终正确填写。
我有以下实体:

@Table("article_list_meta")
@Data
public class ArticleList {
    @Id
    private final Long id;
    @Version
    private long version;
    @MappedCollection(idColumn = "list_id", keyColumn = "seq")
    private List<ArticleListEntry> entries = new ArrayList<>();  

    @PersistenceConstructor
    public ArticleList(Long id, String publication, String name) {
        this.id = id;
        this.publication = publication;
        this.name = name;
    }
    public ArticleList(String publication, String name) {
        this(null, publication, name);
    }
    // other fields
}

@Data
@Table("article_list_entry")
public class ArticleListEntry {

    @Column("article_id")
    private final long articleId;

}

使用存储库

@Repository
public interface ArticleListRepository extends CrudRepository<ArticleList, Long> {}

我坚持使用

ArticleList entity = repository.findByPublicationAndName(publication, name)
                .orElseGet(() -> new ArticleList(publication, name));
        entity = mapper.fromDto(entity, list, fieldsToUpdate);
        ArticleList persistedEntity = repository.save(entity);

在最初的( version == 0 )保存,以下所有更新都包含所有相关项。请注意 AbstractRelationalEventListener<ArticleList> 为第一次调用接收具有空列表的相同实体 save(articleList) ( persistedEntity ). 这个 entity 仍然包含文章。
这让我相信我偶然发现了一个bug,但由于这是我们第一个使用datajdbc而不是datajpa的项目,所以我的实体中可能也有问题。
我使用的是springboot2.3.6.release和springdatajdbc的2.0.5.release版本。

disbfnqx

disbfnqx1#

这是一种 entries 不是持久性构造函数的一部分。
当使用构造函数创建示例的副本时(例如,因为需要设置id),只有该构造函数中包含的属性被复制。
所以为了解决这个问题,你应该修改 ArticleList 看起来像这样:

@PersistenceConstructor
public ArticleList(Long id, String publication, String name, List<ArticleListEntry> entries) {
    this.id = id;
    this.publication = publication;
    this.name = name;
    this.entries = entries;
}

相关问题