如何解决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
上提出一个问题版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。