부가 기능
- JPA는 자바에서 제공하는 Collection, List, Set, Map 컬렉션을 지원한다.
@OneToMany,@ManyToMany를 사용해서 1:N, N:M 매핑@ElementCollection을 이용해서 값 타입을 하나 이상 보관- 컬렉션 필드를 hibernate는 미리 준비한 컬렉션으로 감싸서 사용한다.
- Collection, List는 중복을 허용하므로
PersistentBag을 래퍼로 사용한다. ( 엔티티를 추가해도 지연 로딩된 컬렉션을 초기화 하지 않는다. ) - List +
@OrderColumn순서 보장을 원한다면 사용하면 된다. DB에서 순서 값도 함께 관리한다. 순서 변경시 뒤의 row의 값도 연쇄적으로 수정된다. - Set은 중복을 허용하지 않으므로
PersistentSet을 래퍼로 사용한다. (HibernateSet으로 초기화 + hascode도 함께 사용해야 한다.)
- Collection, List는 중복을 허용하므로
@OrderBy, @Where
- DB의 orderBy, where을 명시적으로 해당 엔티티를 제공하면 사용하도록 할 수 있다.
@Converter
- 엔티티의 데이터를 변환해서 DB에 저장할 수 있게 한다.
public interface AttributeConverter <X, Y> { public Y convertToDatabaseColumn (X attribute); // 엔티티 -> DB public X convertToEntityAttribute (Y dbData);// DB -> 엔티티 } - 위의 인터페이스를 구현해서 컨버터를 작성한다.
@Converter(autoApply = true)로 글로벌 적용할 수 있다.
Listener
PrePersistPostLoadPreUpdatePreRemovePostPersistPostUpdate-
PostRemove - 직접 받거나 별도의 리스너를 등록해서 받을 수 있다.
- 엔티티에 직접 적용
@PrePersist,@PostLoad,@PreUpdate,@PreRemove,@PostPersist,@PostUpdate,@PostRemove-
위의 어노테이션을 붙여서 작동시킨다.
-
- 별도 리스너 등록
@EntityListeners(~.class)를 붙여서 한다. - 기본 리스너 사용
- 엔티티에 직접 적용
- 여러 리스너를 사용하면
1. 기본 리스너>2. 부모 클래스 리스너>3. 리스너>4. 엔티티순으로 적용된다.
엔티티 그래프
- 엔티티 그래프는 엔티티 조회 시점에 연관된 엔티티들을 함께 조회하는 기능이다.
1. NamedEntityGraph
@NamedEntityGraph(name = , attributeNodes = )로 사용한다.- 엔티티 그래프는 JPA의 힌트 기능을 사용해서 동작한다. 힌트 키로
jakarta.persistence.fetchgraph를 사용하고 힌트 값으로 찾아온 엔티티 그래프를 사용하면 된다.
2. subgraph
@NamedEntityGraph에 subgraphs로 하위 엔티티의 서브 노드들을 조회할 수도 있다.@NamedSubgraph로 조회할 수 있다.
3. JPQL에서 엔티티 그래프 사용
em.find()에 힌트를 추가하면 된다.setHint("jakarta.persistence.fetchgraph", em.getEntityGraph())로 찾는다.
4. 동적 엔티티 그래프
EntityGraph<A> graph = em.createEntityGraph(A.class)로 동적으로 엔티티 그래프를 구성할 수 있다.