하이버네이트는 컬렉션을 효율적으로 관리하기 위해 엔티티를 영속 상태로 만들 때 원본 컬렉션을 감싸고 있는 내장 컬렉션을 생성해서 이 내장 컬렉션을 사용하도록 참조를 변경한다. 하이버네이트가 제공하는 내장 컬렉션(org.hibernate.collection.internal.PersistentBag)은 원본 컬렉션을 감싸고 있어서 래퍼 컬렉션으로도 부른다.
하이버네이트는 이런 특징 때문에 컬렉션을 사용할 때 다음처럼 즉시 초기화해서 사용하는 것을 권장한다.
Collection<Member> members = new ArrayList<>();
하이버네이트 내장 컬렉션과 특징
컬렉션 인터페이스 | 내장 컬렉션 | 중복 허용 | 순서 보관 |
Collection, List | PersistentBag | O | X |
Set | PersistentSet | X | X |
List + @OrderColumn | PersistentList | O | O |
Collection, List
Collection, List 인터페이스는 중복을 허용하는 컬렉션이고 PersistentBag을 래퍼 컬렉션으로 사용한다. ArrayList로 초기화하면 된다.
엔티티를 추가할 때 중복된 엔티티가 있는지 비교하지 않고 단순히 저장만 하면 된다. 따라서 엔티티를 추가해도 지연 로딩된 컬렉션을 초기화하지 않는다.
Set
Set은 중복을 허용하지 않는 컬렉션이다. PersistentSet을 컬렉션 래퍼로 사용한다. HastSet으로 초기화하면 된다.
Set은 엔티티를 추가할 때 중복된 엔티티가 있는지 비교해야 한다. 따라서 엔티티를 추가할 때 지연 로딩된 컬렉션을 초기화한다.
List + @OrderColumn
List 인터페이스에 @OrderColumn을 추가하면 순서가 있는 특수한 컬렉션으로 인식한다. 순서가 있다는 의미는 데이터베이스에 순서 값을 저장해서 조회할 때 사용한다는 의미다. PersistentList를 래퍼 컬렉션으로 사용한다.
@OrderColumn은 단점이 너무 많다. 직접 POSITION 값을 관리하거나 @OrderBy를 사용하길 권장한다.
@Entity
public class Board {
@Id @GenerateValue
private Long id;
@OneToMany(mappedBy = "board")
@OrderColum(name = "POSITION")
private List<Comment> comments = new ArrayList<Comment>();
}
@OrderBy
@OrderBy는 데이터베이스의 ORDER BY절을 사용해서 컬렉션을 정렬한다.
모든 컬렉션에 사용할 수 있다.
@Entity
public class Board {
@Id @GenerateValue
private Long id;
@OneToMany(mappedBy = "board")
@OrderBy("username desc, id asc")
private List<Comment> comments = new ArrayList<Comment>();
}
'JVM > JPA' 카테고리의 다른 글
리스너 (0) | 2023.07.02 |
---|---|
@Converter (0) | 2023.07.02 |
스프링 데이터 JPA와 QueryDSL 통합 (0) | 2023.07.02 |
스프링 데이터 JPA (0) | 2023.07.02 |
객체지향 쿼리 심화 (0) | 2023.06.30 |