programing

Spring Data Jpa OneTo많은 사람들이 동시에 자식과 부모 개체를 저장합니까?

bestprogram 2023. 9. 9. 09:46

Spring Data Jpa OneTo많은 사람들이 동시에 자식과 부모 개체를 저장합니까?

이것은 제 부모님의 실체입니다.참고: 간략화를 위해 getter, setter, lombook 주석을 제거합니다.

@Entity
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @OneToMany(mappedBy = "board")
    private Set<Story> stories = new HashSet<>();
}

아래는 나의 자식 개체입니다.

@Entity
public class Story {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "board_id")
    @JsonIgnore
    private Board board;
}

각각Board여러 개를 가질 수 있습니다Story, 다만 각각Story싱글에 속함Board.

이제 제가 섬기는 어딘가에서, 저는 이것을 하고 있습니다.

public void addBoard(BoardDTO boardDto){
    // create a new board object which is just a pojo
    // by copying properties from boardDto
    Board board = ...;

    // create set of stories
    List<String> defaultTitles = Arrays.asList("Todo", "In-Progress", "Testing", "Done");
    Set<Story> stories = defaultTitles.stream().map(title -> Story.builder()
            .title(title)
            // assign a reference, I know this is wrong since board here is not
            // saved yet or fetched from db, hence the question
            .board(board) 
            .build())
            .collect(Collectors.toSet());

    // This saves board perfectly, but in Story db, the foreign key column
    // board_id is null, rightfully so since call to story table was not yet done.
    Board save = boardRepository.save(Board.builder()
            .title(board.getTitle())
            .stories(stories)
            .build());
}

제가 취할 수 있는 한 가지 방법은 먼저 보드를 저장하는 것입니다.Set<Story>저장된 게시판을 참조로 설정해서 스토리를 저장합니다.하지만 이것은 두 번의 Repository 호출이 필요할 것이고 코드적으로는 보기 좋지 않을 것입니다.

또한 제가 문제가 있는 이유는 이 코드를 실행하기 전까지 db가 비어있기 때문입니다.이게 저희가 처음 진출하는 신기록이라서. 그래서.Board table아직 행이 없습니다.

그럼 한방에 할 수 있는 방법이 있을까요?스택 오버플로에 대한 다른 질문의 대부분은 이미 db에서 보드 엔티티를 가져온 다음 하위 엔티티를 추가하여 db에 저장합니다.하지만 저는 DB가 완전히 새로워지고, 동면 상태에서 여러 DB 호출을 하더라도 코드적으로 최소한 첫 번째 새로운 상위 엔티티와 해당 하위 엔티티를 동시에 추가하고 싶습니다.

예, 부모에서 자식으로 변경되는 내용을 캐스케이드하기만 하면 됩니다.

@Entity
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @OneToMany(mappedBy = "board", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private Set<Story> stories = new HashSet<>();
}

이제 부모를 저장할 때마다 (Board), 변경 내용이 하위 테이블로 캐스케이드됩니다.사용할 수도 있습니다.CascadeType.ALL대신에{CascadeType.PERSIST, CascadeType.MERGE}제거와 같은 변경 사항을 캐스케이드합니다(부모 엔티티의 컬렉션에서 자식을 제거하면 자식 테이블의 조인 ID가 제거됩니다).

언급URL : https://stackoverflow.com/questions/60024214/spring-data-jpa-onetomany-save-child-and-parent-entities-at-the-same-time