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
'programing' 카테고리의 다른 글
프로그래밍 방식으로 다른 보기 컨트롤러/장면으로 이동 (0) | 2023.09.09 |
---|---|
SQL Server의 이미지 필드 컨텐츠 크기는 어떻게 됩니까? (0) | 2023.09.09 |
따옴표로 구분된 문자열을 쉼표로 만드는 Powershell Array (0) | 2023.09.09 |
트리거 최적화 (0) | 2023.09.09 |
Oracle에 대한 쿼리문 업데이트 (0) | 2023.09.09 |