spring数据jdbc:repository不保存从第三层开始的嵌套实体

fd3cxomn  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(229)

我要持久化一个树状实体,其结构如下:

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

SpringDataJDBC只对“task2”和“task”执行插入操作已忽略任务3。
java11、spring数据jdbc 2.0.3、mariadb 10.3

kkih6yb8

kkih6yb81#

在当前的表单中,这是误用spring数据jdbc,因为聚合(和聚合根)没有正确分离。 Task 似乎是一个聚合根,因此引用 Task 它的子对象应该是通过id,而不是通过对象引用。看到了吗https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates 更多细节。
因此,我建议每个 Task 它自己的集合。
当然,spring数据jdbc应该抛出一个异常,而不是默默地忽略模型的一部分。请提出一个问题https://jira.spring.io/projects/datajdbc/issues

相关问题