부가 기능

  • JPA는 자바에서 제공하는 Collection, List, Set, Map 컬렉션을 지원한다.
  • @OneToMany,@ManyToMany를 사용해서 1:N, N:M 매핑
  • @ElementCollection을 이용해서 값 타입을 하나 이상 보관
  • 컬렉션 필드를 hibernate는 미리 준비한 컬렉션으로 감싸서 사용한다.
    1. Collection, List는 중복을 허용하므로 PersistentBag을 래퍼로 사용한다. ( 엔티티를 추가해도 지연 로딩된 컬렉션을 초기화 하지 않는다. )
    2. List + @OrderColumn 순서 보장을 원한다면 사용하면 된다. DB에서 순서 값도 함께 관리한다. 순서 변경시 뒤의 row의 값도 연쇄적으로 수정된다.
    3. Set은 중복을 허용하지 않으므로 PersistentSet을 래퍼로 사용한다. (HibernateSet으로 초기화 + hascode도 함께 사용해야 한다.)

@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

  • PrePersist
  • PostLoad
  • PreUpdate
  • PreRemove
  • PostPersist
  • PostUpdate
  • PostRemove

  • 직접 받거나 별도의 리스너를 등록해서 받을 수 있다.
    1. 엔티티에 직접 적용

      @PrePersist, @PostLoad, @PreUpdate, @PreRemove, @PostPersist,@PostUpdate, @PostRemove

      • 위의 어노테이션을 붙여서 작동시킨다.

    2. 별도 리스너 등록

      @EntityListeners(~.class)를 붙여서 한다.

    3. 기본 리스너 사용
  • 여러 리스너를 사용하면 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)로 동적으로 엔티티 그래프를 구성할 수 있다.