Spring/JPA

JPA와 컬렉션

하효닝 2022. 3. 25. 18:35

컬렉션

  • JPA는 자바에서 기본으로 제공하는 Collection, List, Set, Map 컬렉션을 지원한다.
  • 컬렉션은 일대다나 다대다 엔티티 관계를 매핑하거나, @ElementCollection을 사용해서 값 타입을 하나 이상 보관할 때 사용된다.

 

래퍼 컬렉션

  • 하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 하이버네이트에서 준비한 컬렉션으로 감싸서 사용한다.
  • 이는 컬렉션을 효율적으로 관리하기 위한 것으로, 원본 컬렉션을 감싸는 내장 컬렉션을 생성해서 이 내장 컬렉션을 사용하도록 참조를 변경한다.
컬렉션 래퍼 컬렉션 초기화
Collection, List PersistenceBag ArrayList
Set PersistenceSet HashSet

 

  • 하이버네이트의 이러한 특징 때문에 컬렉션을 사용할 때는 즉시 초기화해서 사용하는 것이 좋다.
List<Member> members = new ArrayList<Member>();

 

 

Collection, List

  • Collection과 List 인터페이스는 중복을 허용하는 컬렉션으로, PersistenceBag을 래퍼 컬렉션으로 사용한다. 
  • 중복을 허용하기 때문에 add() 메서드를 실행하면 중복된 엔티티가 있는지 비교하지 않는다.
  • 따라서 엔티티를 추가해도 지연 로딩된 컬렉션을 초기화하지 않는다.

 

Set

  • Set은 중복을 허용하지 않는 컬렉션으로, 하이버네이트는 PersistenceSet을 래퍼 컬렉션으로 사용한다
  • 중복을 허용하지 않기 때문에 엔티티를 추가할 때 중복된 엔티티가 있는지 비교해야 한다.
  • 따라서 엔티티를 추가할 때 지연 로딩된 컬렉션을 초기화한다.