inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

코드로 배우는 React 19 with 스프링부트 API서버

서비스계층과 컨트롤러(1) - 상품 목록/등록

Entity에 ElementCollection이 두 개 있는 경우

262

김동영

작성한 질문수 3

0

안녕하세요! 하나의 엔티티에 @ElementCollection 붙은 필드가 두 개 있는 경우를 시험해 보고 있습니다. @EntityGraph(attributePaths = {"a", "b"}) 이런 식으로 해서 테스트를 돌리면 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 과 같은 오류가 나는데 ElementCollection 두 개가 있는 경우는 하나의 쿼리로 모두 가져오는 방법은 없나요?

react spring-boot jpa jwt redux-toolkit

답변 1

0

구멍가게코딩단

말씀하신 내용은 https://jojoldu.tistory.com/457

인데 @ElementCollection으로 적용하시는 거죠?

 

음..BatchSize를 지정했던 것으로 기억하는데.. 저녁에 조금 더 살펴보고 댓글 남기겠습니다.

 

우선은 이런 방법도 있으니...

 

https://stackoverflow.com/questions/49127043/multiple-elementcollections-with-jpa-error-persistenceunit-jpa-unable-to

0

김동영

빠른 답변 감사합니다! 아래 따라 해봤는데 안되는 것 같아요...

1

구멍가게코딩단

package com.example.demo.entity;


import jakarta.persistence.*;
import lombok.*;

@Entity
@Table(name = "tbl_todos")
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = {"tags", "files"})
@Builder
public class TodoEntity {

    @Id
    @GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY)
    private Long tno;

    private String title;

    private boolean complete;


    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "tbl_todo_tags")
    @Builder.Default
    private java.util.Set<String> tags = new java.util.HashSet<>();

    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "tbl_todo_files")
    @Builder.Default
    private java.util.Set<String> files = new java.util.HashSet<>();

    public void addTag(String tag) {
        tags.add(tag);
    }

    public void addFile(String file) {
        files.add(file);
    }

    public void removeTags() {
        tags.clear();
    }

    public void removeFiles() {
        files.clear();
    }


    public void changeTitle(String title) {
        this.title = title;
    }

    public void changeComplete(boolean complete) {
        this.complete = complete;
    }

}
public interface TodoRepository extends JpaRepository<TodoEntity, Long>{


    @EntityGraph(attributePaths = {"tags", "files"}, type = EntityGraph.EntityGraphType.FETCH)
    @Query("select t from TodoEntity t where t.tno = :tno")
    Optional<TodoEntity> findByTno(Long tno);

}

List 대신에 Set으로 하셔야 Bag관련 에러가 발생하지 않습니다.

 

@Test
@Transactional
public void testRead() {
    Long tno = 1L;

    todoRepository.findByTno(tno).ifPresent(todo -> {
        System.out.println(todo);
        System.out.println(todo.getTags());
        System.out.println(todo.getFiles());
    });
}


결과---------------------------------------
Hibernate: 
    select
        te1_0.tno,
        te1_0.complete,
        f1_0.todo_entity_tno,
        f1_0.files,
        t1_0.todo_entity_tno,
        t1_0.tags,
        te1_0.title 
    from
        tbl_todos te1_0 
    left join
        tbl_todo_files f1_0 
            on te1_0.tno=f1_0.todo_entity_tno 
    left join
        tbl_todo_tags t1_0 
            on te1_0.tno=t1_0.todo_entity_tno 
    where
        te1_0.tno=?
TodoEntity(tno=1, title=Sample...0, complete=false)
[t1, t2]
[f1, f2]

0

김동영

정말 감사합니다!! 좋은 밤 되십시오!!

동일하게 실습하는데 이상하게 페이지를 찾지 못하네요..

0

74

2

22. REST 방식 컨트롤러 만들기(2), 29. 등록처리 부분 질문이 있습니다.

0

74

2

37강. 강의수업듣다 질문드립니다.

0

57

2

TodoDTO test 함수

0

80

3

강사님 오타 있음요

0

79

2

No 1. 교제(ppt) soruce 복붙 문제 의 건

0

95

4

No 1. 교제(ppt) soruce 복붙 문제 의 건

0

70

3

17강 문의드립니다.

0

44

1

카카오 연동설정이 이제 안되는거 같아요

0

195

2

8장 마지막 강의 시 오류

0

98

4

혹시 뭐가 문제인지 알 수 있나요?

0

87

2

챕터: React-Router 설정

0

58

2

백)TODO관련

0

56

2

마리아 db 설치중 포트를 이미 사용중이라고 합니다

0

113

2

이강의 듣고 소화시켰다면 몇년차 정도 개발자라고 할수 있을까요?

0

105

1

CSR , SSR 의 수요 궁금증 질문

0

83

2

섹션5부터...

0

73

1

간단한 코드 질문!!

0

61

2

tbl_todo 질문입니다

0

65

2

수업 외 질문인데 'tbl'이 무슨 의미인가요???

0

292

2

엔티티클래스에서 질문입니다

0

78

2

수정시 writer값이 삭제되는 오류

0

42

2

교안 31 오타 수정해주세요

0

64

2

쿠키에 accessToken, refreshToken을 담고, 조회 시에 undefined

0

81

1