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

자바 컬렉션 인터페이스의 특징 - Collection : 자바가 제공하는 최상위 컬렉션이다. 하이버네이트는 중복을 허용하고 순서를 보장하지 않는다고 가정한다. - Set : 중복을 허용하지 않는 컬렉션이다. 순서를 보장하지 않는다. - List : 순서가 있는 컬렉션이다. 순서를 보장하고 중복을 허용한다. - Map : Key, Vale 구조로 되어 있는 특수한 컬렉션이다.
JPA 명세에는 자바 컬렉션 인터페이스에 대한 특별한 언급이 없어 JPA 구현제마다 제공하는 기능이 다를 수 있다. 여기서는 하이버네이트 구현체를 기준
하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 하이버네이트에서 준비한 컬렉션으로 감싸서 사용한다.
//JPA 컬렉션 사용@Entitypublic class Team{ @Id private String id; @OneToMany @JoinColumn private Collection<Member> members = new ArrayList<Member>();}
Team을 영속상태로 만들기
Team team = new Team();// before persist = class java.util.ArrayListSystem.out.println("before persist = " + team.getMembers().getClass());em.persist(team);// before persist = class org.hibernate.collection.internal.PersistentBagSystem.out.println("after persist = " + team.getMembers().getClass());
원래 ArrayList 타입이였던 컬렉션이 엔티티를 영속 상태로 만든 직후 하이버네이트가 제공하는 PersistentBag 타입으로 변경되었다.
하이버네이트는 컬렉션을 효율적으로 관리하기 위해 엔티티를 영속 상태로 만들 때 원본 컬렉션을 감싸고 있는 내장 컬렉션을 생성해서 이 내장 컬렉션을 사용하도록 참조를 변경한다.
하이버네이트가 제공하는 내장 컬렉션은 원본 컬렉션을 감싸고 있어서 래퍼 컬렉션으로도 부른다.
하이버네이트는 이런 특징 때문에 컬렉션을 사용할 때 즉시 초기화해서 사용하는 것을 권장한다.