首页 > 解决方案 > Spring Data JDBC:存储库不保存从第三级开始的嵌套实体

问题描述

我想坚持一个结构如下的树状实体:

CREATE TABLE `task` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `parent_id` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

@Data
@Table
public class Task {
    @Id
    private Integer id;
    
    @MappedCollection(idColumn = "parent_id")
    private Set<Task> subItems;
}

public interface TaskRepository extends org.springframework.data.repository.CrudRepository<Task, Integer> {} 

初始化实体:

Task task = new Task();
Task task2= new Task();
Task task3= new Task();

task.setSubItems(Set.of(task2));
task2.setSubItems(Set.of(task3));

taskRepository.save(task);//auto-generated method

Spring data jdbc 仅对 'task2' 和 'task' 执行插入操作。'task3' 被忽略。

Java11、Spring-data-jdbc 2.0.3、Mariadb 10.3

标签: javamariadbspring-data-jdbc

解决方案


在当前形式中,这是滥用 Spring Data JDBC,因为聚合(和聚合根)没有正确分离。

Task似乎是一个聚合根,因此从一个Task到其子级的引用应该是通过 id 而不是通过对象引用。有关此内容的更多详细信息,请参阅https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates

因此,我建议将每一个都设为Task自己的聚合。

当然,Spring Data JDBC 应该可能会抛出异常,而不是默默地忽略模型的一部分。请在https://jira.spring.io/projects/DATAJDBC/issues上提出问题


推荐阅读