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数据jdbc仅对'task2'和'task'执行插入操作。 'task3'被忽略。

Java11,Spring-data-jdbc 2.0.3,Mariadb 10.3

解决方法

在当前形式下,这会滥用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

上提出一个问题