我要持久化一个树状实体,其结构如下:
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
1条答案
按热度按时间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