Programming/JPA & Spring Data JPA 기초

16. 엔티티 간 1-N 단방향 연관 매핑

JKROH 2023. 3. 28. 18:13
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* 1-N 단방향 연관 매핑

  • 콜렉션을 사용한 매핑 : Set, List, Map

 

* 1-N 단반향 Set 연관 매핑

  • 참조키를 이용한 1-N 관계를 생성할 수 있다.
  • player는 team_id를 통해 team 테이블을 참조한다.

 

* 1-N 단방향 Set 연관 매핑 설정

  • Team 클래스에서 확인할 수 있다.
  • @OneToMany, @JoinColumn(name = "참조할 칼럼")을 이용해 1-N 단방향 연관 매핑을 설정할 수 있다.

 

* Set 저장

  • 여러 Player를 find(); 해온 뒤, player들의 Set을 만들어서 저장하고 이를 Team에 넣어 persist(team);을 한다.
  • team 데이터를 삽입 한 뒤, 기존 player 테이블의 데이터에 대한 update가 발생한다. team에 삽입된 player의 id를 가지고 있는 튜플들의 team_id 값을 update 한다.

 

* Set에 추가, 삭제

  • Set에서 제외하면 team_id에 null이 들어가고, Set에 추가하면 team_id가 들어가게 update 된다.
  • Team객체에서 모든 Set을 clear();하게 된다면, team_id가 초기화 된 객체의 id와 같은 모든 player 튜플들의 team_id값을 null로 업데이트 한다.

 

* 1-N 단방향 List 연관 매핑

  • survey_question은 survey_id를 통해 survey 테이블을 참조한다.

 

* 1-N 단방향 List 연관 매핑

  • Survey 클래스에서 확인할 수 있다.
  • @OneToMany, @JoinColumn(name = "참조할 칼럼")을 사용하는 것은 같다.
  • 추가로 @OrderColumn(name = "순서를 저장할 칼럼")을 사용한다. Set과 다르게 index값이 필요하기 때문이다.
  • 위의 예시에선 order_no가 indexing 칼럼으로 사용되었다.

 

* List 저장

  • Question 여러 개를 담은 List를 담아서 Survey를 만들고 persist();하면 survey 테이블에 데이터가 삽입되고 survey_question 테이블에서 List에 담긴 데이터들의 id를 가진 데이터들의 survey_id값과 order_no가 update된다.

 

* List에 추가, 삭제

  • 마찬가지로 update 된다.

 

* 1-N 단방향 Map 연관 매핑

  • game_member는 game_id를 통해 game 테이블을 참조한다.
  • Map의 key값이 될 칼럼은 game_member에 있다. 위의 예시에서는 role_name이 Map의 key로 쓰인다.
  • Member 클래스가 value가 된다.

 

* 1-N 단방향 Map 연관 매핑 설정

  • Game 클래스에서 확인할 수 있다.
  • @OneToMany, @JoinColumn(name = "참조할 칼럼")을 사용하는 것은 같다.
  • 추가로 @MapKeyColumn(name = "key값이 될 칼럼")을 사용한다. Key 값으로 사용될 칼럼이 필요하기 때문이다.
  • 위의 예시에선 role_name이 key 칼럼으로 사용되었다.

 

* Map 저장

  • 위의 방식과 같게 저장하면, game_member 테이블에서 해당하는 튜플들의 game_id값과 role_name값을 update한다.

 

*Map에 추가, 삭제

  • 위의 예시들과 같다. 삭제되면 game_id, role_name이 null이 되고 추가되면 update된다.
반응형