ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] 우승 멤버 별표표시 , @ElementCollection
    Backend/개발 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

    댓글

Designed by Tistory.