본문 바로가기
관리자

Programming-[Backend]/JPA

[TIL] JPA @ManyToMany 적용, 테이블 이름과 컬럼, 저장 처리 방식

728x90
반응형

 

1. 배경

예전에 JPA를 학습할 때, @ManyToMany는 사용하면 안된다고 배웠었다. 이것은 혹시나 나중에 두 엔티티간 매핑 테이블에 컬럼이 추가될 수도 있는데 @ManyToMany를 적용하면 컬럼 추가가 어렵기 때문이라고 배웠다.

 

https://whitepro.tistory.com/413

 

그래서 한 번도 써보지 않았는데, 정말 순수하게 mapping만 필요한 경우이고 간단하게만 적용하면 되는 경우라 적용하게 되었다. 위 예시에서처럼 추가 정보가 필요한 경우 두 엔티티 중 하나의 테이블에 컬럼을 추가하면 된다고 생각이 들었다. 그리고 서비스가 크지 않고 향후에도 큰 영향도가 없다고 판단되어 일단 적용해보았다.

 

절대 권장할만한 방식은 아닌 것 같다. 그래도 일단 기록은 남긴다.

 

 

 

 

2. 실제 적용 예시

두 엔티티 중 한 쪽

@ManyToMany(mappedBy = "places")
private Set<Event> Events;

 

반대쪽

@ManyToMany
@JoinTable(name = "place_event",
        joinColumns = @JoinColumn(name = "event_id"),
        inverseJoinColumns = @JoinColumn(name = "place_id"))
private Set<Place> places;

 

  • 테이블 이름이 @JoinTable에서 정의하는 name값과 일치해야한다.
  • 상기 언급한대로 id, event_id, place_id 외에 다른 컬럼을 지정하더라도 null로 기록된다.
  • 저장 시에는 양쪽에서 서로의 값을 set으로 저장 처리를 해줘야한다.
//event를 세팅해주는 코드 생략
//place를 세팅해주는 코드 생략

//place에 event 지정 후 저장
place.setEvents(Set.of(place));
placeRepository.save(place);

//event에 place 지정 후 저장
event.setPlaces(Set.of(place));
eventRepository.save(event);

 

728x90
반응형