본 내용은 유튜브 최범균님의 강의 내용을 정리한 내용입니다.
JPA 기초 09 값 콜렉션 List 매핑
컬렉션 List 타입 필드 매핑
package com.example.jpa.entity;
...
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "question")
public class Question {
@Id
private String id;
private String text;
@ElementCollection
@CollectionTable(
name = "question_choice",
joinColumns = @JoinColumn(name = "question_id")
)
@OrderColumn(name = "idx") // 인덱스 값 컬럼 지정
@Column(name = "text")
private List<String> choices;
}
- List 타입의 choices 필드를 매핑하는 예시입니다.
- @OrderColumn 어노테이션은 List의 순서(INDEX)를 저장할 컬럼을 지정할 때 사용합니다.
엔티티 객체 저장
Question question = new Question("Q1", "질문", List.of("보기1", "보기2"));
entityManager.persist(question);
- List 타입의 값을 저장할 때 INDEX 값도 같이 저장합니다.
데이터베이스 조회
엔티티 객체 조회(Lazy, Eager)
Question foundQuestion = entityManager.find(Question.class, question.getId());
System.out.println("보기 개수: " + foundQuestion.getChoices().size());
- Lazy일 경우에는 foundQuestion.getChoices() 실행시 SELECT 쿼리가 따로 진행되고 Eager일 경우에는 LEFTJOIN을 사용하여 한번에 조회합니다.
List 수정 - 새로 할당
Question foundQuestion = entityManager.find(Question.class, question.getId());
foundQuestion.setChoices(List.of("보기3", "보기4"));
- DELETE 쿼리를 실행하여 기존의 choices 값들을 삭제 후 새로운 값을 INSERT 합니다.
엔티티 객체 삭제
Question foundQuestion = entityManager.find(Question.class, question.getId());
entityManager.remove(foundQuestion);
Hibernate:
delete from question_choice where question_id=?
Hibernate:
delete from question where id=?
- Question 객체를 삭제하는 경우 해당 객체와 연관된 데이터가 모두 삭제됩니다.
@Embeddable 타입 List 매핑 설정
package com.example.jpa.entity;
...
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "question")
public class Question {
@Id
private String id;
private String text;
@ElementCollection
@CollectionTable(
name = "question_choice",
joinColumns = @JoinColumn(name = "question_id")
)
@OrderColumn(name = "idx") // 인덱스 값 컬럼 지정
private List<Choice> choices; // List 제네릭 타입 Choice로 변경
}
- List의 제네릭 타입을 @Embeddable 클래스 타입으로 변경합니다.
package com.example.jpa.entity;
...
@Data
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class Choice {
private String text;
private boolean input;
}