Entity에 ElementCollection이 두 개 있는 경우
262
작성한 질문수 3
안녕하세요! 하나의 엔티티에 @ElementCollection 붙은 필드가 두 개 있는 경우를 시험해 보고 있습니다. @EntityGraph(attributePaths = {"a", "b"}) 이런 식으로 해서 테스트를 돌리면 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 과 같은 오류가 나는데 ElementCollection 두 개가 있는 경우는 하나의 쿼리로 모두 가져오는 방법은 없나요?
답변 1
0
말씀하신 내용은 https://jojoldu.tistory.com/457
인데 @ElementCollection으로 적용하시는 거죠?
음..BatchSize를 지정했던 것으로 기억하는데.. 저녁에 조금 더 살펴보고 댓글 남기겠습니다.
우선은 이런 방법도 있으니...
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
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





