问题描述
我想持久保留具有这样结构的树状实体:
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
上提出一个问题