• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

앤티티에서 두개의 같은 앤티티를 매핑하는 법에 대해 질문드립니다.

20.09.11 17:40 작성 조회수 2.25k

0

안녕하세요 선생님 

선생님의 강의 덕분에 JPA 대해 많은것을 알게 되었습니다. 다름이 아니오라 JPA를 활용한 가벼운 프로젝트를 만들다

이럴때는 어떤 방식으로 하시는지 궁금해 질문드리게 되었습니다.

예를 들어 A팀과 B팀이라는 축구 팀이 있습니다. (Team 이라는 앤티티)

이 두팀의 서로 경기일정, 장소,경기 득점을 담는 경기일정 테이블이 있습니다. (Match 라는 앤티티)

여기서 Match라는 앤티티에 두팀을 매핑 시키는 방법에 대해 질문드리게 되었습니다.

--------------------------------------------------------------------------------------------------------------

첫번째 방법은 Match테이블에 두 앤티티를 받는 방법인데

생각한 방식은 홈팀과 어웨이 팀으로 해서 만드는 방식을 생각했습니다 그런데 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.springjpa.sample.soccorshop.domain.team.match.Match column: team_pkid (should be mapped with insert="false" update="false")

이 오류의 설명 처럼 insert="false" update="false"로 하는 것이 맞는지 모르겠습니다. 두개의 동일한 앤티티를 한 앤티티에 넣는 경험이 없어 맞는지 의심이 들어...

---------------------------------------------------------------------------------------------------------------------

두번째 생각한 방법은 한 Match 테이블에서 한쪽은 Team으로 다른쪽은 팀의 주장인 Member앤티티로 조회하는 방법

강의를 통해서 또는 다른 기능들을 구현하면서(예를 들어 한 회원이 팀에 들어가고 싶어 축구 팀에 가입 신청을 하면 

팀에서 가입 요청 목록을 조회하여 그회원을 가입허가)

Member(회원 ){1} ------- {N}JoinRequest(가입요청){M}----------{1}Team(팀)

다른 엔티티를 탐색하는 것에 익숙하다 보니 이방식으로 구현할수도 있다고 생각합니다.

경기가 끝나고 득점같은 것을 Match테이블에 기록하고

나중에 경기 결과 리스트를 만들때는 

'homeTeam의 id와 소속한 팀의 id가 같거나 awayCaption의 id와 소속한 팀의 주장의 id와 같은 Match테이블'을

jpql로 해서 받을수 있지 않을까 생각합니다.

----------------------------------------------------------------------------------------------------------------

세번째는 그냥 Member, Team 매핑 하지말고 그냥 String으로 두개의 팀이름으로 작성하자는 방법입니다.

이렇게 테이블을 작성하고 나중에 조회할때는

homeTeamName, awayTeamName 둘중 하나와 소속한 팀의 이름이 같은 Match테이블 리스트를 반환하는 방법입니다.

이 방법으로는 쉽게 구현할 수 있다고 생각하지만 디테일한 예전 기록을 볼려면 getter을 활용한 List를 반환 받을수 없다고는 생각합니다

세가지 방법을 생각해봤는데 2번째 방법은 다른 앤티티 탐색의 경험으로 저렇게 하면 되지 않을까 라는 생각이지만

굳이 저렇게 할 필요가 있나? 라는 생각도 있어 잘 모르겠습니다...

현업에서는 매칭 같은 것은 어떤 방식으로 구현하시는지 궁금해 여쭙게 되었고 혹시나 제가 생각한것과 다른 방식이 있는지 

조언을 여쭙고자 글을 남기게 되었습니다.  혹시 설계의 기본도 없다고 말씀해 주셔도 감사히 새겨 듣겠습니다.

마지막으로

활용1,2 데이터 JPA, querydsl도 한번으로 끝내지 않고 여러번 정독하면서 제것으로 만들려고 하고 있습니다.

좋은 강의, 기술들을 쉽게 잘 설명해 주셔서 항상 감사드립니다.

답변 2

·

답변을 작성해보세요.

2

안녕하세요. 권정현님^^

팀이 homeTeam, awayTeam 2개가 있다면 첫번째 방법이 맞습니다.

문제는 외래키를 따로 설정해야 하는데 같이 설정해서 오류가 발생했습니다. 다음 코드를 참고해주세요^^

@MayToOne(fetch=FetchType.LAZY)
@JoinColumn(name="home_team_id")
private Team homeTeam;

@MayToOne(fetch=FetchType.LAZY)
@JoinColumn(name="away_team_id")
private Team awayTeam;

1

권정현님의 프로필

권정현

질문자

2020.09.11

저는

public class Team{
@Id
@...
@Column(name="team_id")
private Long id;
...
}

Team의 아이디의 컬럼명과 Match의 @JoinColumn명이 같아야 되는줄 알았습니다. 이 부분에 대해 다시 공부하겠습니다. 

감사합니다.