Backend/개발

[Spring Boot] 우승 멤버 별표표시 , @ElementCollection

지수쓰 2021. 8. 5. 23:13
반응형

오늘은 경매프로그램은 아니구,, 지금 쓰고있는 내전 사이트에서 리그 우승멤버한테 별표를 달아주라고 해서

재밌을것 같아서 살짝 해봤다~

 

<잠깐생각>

member에 우승 컬럼 추가해서

List isWin

1, 2, 이런식으로 넣고 조회?

 

List<Long>을 추가하려 이런 에러가 생겼다.

RDB에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없어, 별도의 테이블을 생성해야 한다고 한다.

@Entity가 아닌 Basic Type이나 Embeddable Class를 테이블로 생성하여 onetomany관계로 만들어준다.

@CollectionTable(컬렉션 테이블 이름, 조인 설정) 사용

이때 @ElementCollection@Entity@OneToMany 차이는

@ElementCollection

  • 연관된 부모 Entity 하나에만 연관됨 ( 부모와 독립적으로 사용 X)
  • 항상 부모와 함께 저장, 삭제 - cascade.all인셈
  • 부모 entity id와 추가 커럼(basic or embedded)타입으로 구성된다.

웬만하면 쓰지 않고 엔티티로 승격시켜 사용하는 것이 좋음.

근데 뭐 그냥 1, 2 값 저장하는거라 이거로 해도 될 것 같다.

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="MEMBER_LEAGUE_RESULTS", joinColumns = @JoinColumn(name="MEMBER_ID"))
private List<Long> leagueResults = new ArrayList<>();

이렇게 생성해보았다.

Hibernate: 
    create table member_league_results (
       member_id bigint not null,
        league_results bigint
    ) engine=InnoDB
Hibernate: 

    alter table member_league_results 
       add constraint FK2tdtle21bepf0ar4mnb0ymesq 
       foreign key (member_id) 
       references members (account_id)

 

@Transactional
public void updateWinMemberLeagueResult(List<String> members, Long league_id){
  for(String member : members){
    Long accountId = findMemberIdBySummonerName(member);
    memberRepository.findById(accountId).ifPresent(
      e-> {
        e.getLeagueResults().add(league_id);
        memberRepository.save(e);
      });
  }
}

그리고 우승자 닉네임, 대회 번호를 입력받아서 이겼는지 결과 업데이트를 해주는 함수를 작성해보았다.

}
@Test
public void 리그1회_우승_저장(){
    List<String> winners = new ArrayList<>();
    winners.add("xx");
    winners.add("xxg");
    winners.add("잇xxv");
    winners.add("1xxy");
    winners.add("Dxx1");

    Long league_id=1l;

    memberService.updateWinMemberLeagueResult(winners,league_id);
}

신기하게 member테이블에는 속성이 추가가 안돼있고, 새로운 테이블이 만들어져서 

member_id랑 league_results로 이루어져있었다.

@CollectionTable을 쓰면 이런식으로 되는 것 같다.

view에 보여질 땐 memberEntity.getLeagueResults로 불러와줬다.

진짜 별거는 아니구,, 저기 소환사명에 별표를 찍어줬다.

ㅋㅋㅋㅋ 

뭔가 이쁘게 메달모양이나 ,, 어떻게 해보고싶은데 꾸미는거엔 영 소질이 없다 ~_~ 

출처

@ElementCollection