java - 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
解决方案
在当前形式中,这是滥用 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上提出问题
推荐阅读
- c - C中的函数和while循环问题:找不到我无法退出循环的原因
- amazon-s3 - aws s3 上的 Mp4 导致过度获取
- javascript - 当页面动态加载超过 20 个音频标签时,如何自动播放一个音频标签?
- three.js - 从 Blender 将 .obj 导入 Three.js - 模型中缺少孔
- reactjs - 反应路由器在父母中获得道具
- java - Apache POI 抛出空指针异常
- firebase - Flutter + Firebase:如何实现“谷歌登录”
- javascript - 是否使用嵌套样式设置 css总是可交换的?
- javascript - 首次单击关闭按钮后未出现警报消息
- python - Python 'not' 运算符