programing

Spring Data JDBC: 리포지토리에서 세 번째 수준부터 중첩된 엔티티를 저장하지 않습니다.

instargram 2023. 8. 25. 23:13
반응형

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

스프링 데이터 jdbc는 'task2' 및 'task'에 대해서만 삽입 작업을 수행합니다.'task3'이(가) 무시되었습니다.

Java11, Spring-data-jdbc 2.0.3, Mariadb 10.3

현재 형태에서는 Aggregate(및 Aggregate 루트)가 제대로 분리되지 않았기 때문에 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 에서 이에 대한 문제를 제기해 주십시오.

언급URL : https://stackoverflow.com/questions/63743267/spring-data-jdbc-repository-does-not-save-nested-entities-starting-from-third-l

반응형