【问题标题】:Spring Data JDBC: Repository does not save nested entities starting from third levelSpring Data JDBC:存储库不保存从第三级开始的嵌套实体
【发布时间】:2020-09-04 14:39:00
【问题描述】:

我想保留一个结构如下的树状实体:

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

【问题讨论】:

  • 你能告诉我们存储库类吗?
  • Repository 代码尽量简单:import org.springframework.data.repository.CrudRepository;公共接口 TaskRepository 扩展 CrudRepository {}

标签: java mariadb spring-data-jdbc


【解决方案1】:

在当前形式中,这是滥用 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提出一个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2020-04-12
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2021-01-15
    相关资源
    最近更新 更多