[ORM 표준 JPA] 14장 컬렉션과 부가기능
2021. 8. 30. 00:18ㆍ개발공부/JPA 스터디
728x90
컬렉션
persist, 엔티티를 영속성 상태로 변경하면 하이버네이트가 제공하는 PersistentBag로 전환됩니다.
컬렉션 종류
Collection, List
Set: 중복 허용 X
- equals() + hashcode()로 검증합니다.
- Set은 엔티티를 추가할 때 중복 엔티티가 있는지 확인해야하기 때문에 지연 로딩된 컬렉션을 초기화 합니다.
List + @OrderColumn
- List로 받을 때 순서가 정해진 상태로 리턴됩니다.
- 하지만 @OrderColumn은 연관 엔티티 중 FK가 있는 엔티티에만 종속적이고 제한적인 부분이
있기 때문에@OrderBy
를 권장합니다.
@Converter
- 컨버터를 사용하면 엔티티의 데이터 타입을 변환해서 테이블에 저장할 수 있습니다. 그 반대도 가능합니다.
- 글로벌 설정
@Converter(autoApply=true)
을 추가하면 일일이 어노테이션을 지정하지 않아도 해당 타입이 변환됩니다. - 스터디 하면서 알게된건데 ENUM을 변환해서 DB에 저장할 때 주로 사용한다고 합니다. (e.g ENUM -> Varchar(1))
리스너
- JPA 리스너 기능을 사용하면 엔티티의 생명주기에 따른 이벤트를 설정할 수 있습니다.
@MappedSuperclass
와@EntityListeners
는 함께 쓰이면서 테이블로 저장되지 않고 이벤트가 발생했을 때 자동으로 값이 입력되는 필드들을 관리합니다. *(e.g createdDate, modifiedDate)- 사용할 수 있는 이벤트 종류는 아래 그림과 같습니다.
엔티티 그래프
Spring Data JPA and Named entity graphs
Lazy 방식의 fetch 파라미터를 런타임 일때 Eager 방식으로 변경시키는 그래프입니다.
엔티티 그래프 기능을 사용하면 엔티티를 조회하는 시점에 함께 조회할 연관된 엔티티를 선택할 수 있습니다.
따라서 JPQL을 중복 작성하지 않아도 된다는 장점이 있습니다.@EntityGraph*
활용할 경우 Eager 방식으로 join해서 연관 엔티티 데이터까지 검색해줍니다.
@NamedEntityGraph(name = "Team.members", attributeNodes = @NamedAttributeNode("members")) public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "team",fetch = FetchType.LAZY) private List<Member> members = new ArrayList<>(); ///------------------------------------- /* Repository */ @EntityGraph(value = "Team.members") Team findByName(String name);
참고할점:
- 엔티티 그래프는 항상 조회하는 엔티티의
ROOT
에서 시작해야합니다. Member를
조회하는데 Order부터 시작하는 엔티티를 사용하면 안됩니다. - 이미 로딩된 엔티티가 영속성 컨텍스트에 있을 경우 엔티티 그래프는 적용되지 않습니다.
- 엔티티 그래프는 항상 조회하는 엔티티의
참고자료: 자바 ORM 표준 JPA 프로그래밍 (김영한 저)
'개발공부 > JPA 스터디' 카테고리의 다른 글
[ORM 표준 JPA] 16장(완결) 2차 캐시와 락 (0) | 2021.09.05 |
---|---|
[ORM 표준 JPA] 15장 고급주제와 프록시, 성능개선 (0) | 2021.09.05 |
[ORM 표준 JPA] 15장 프록시 심화 (0) | 2021.08.30 |
[실무 JPA] 엔티티 생성 (2) | 2021.08.04 |
[ORM 표준 JPA] 10장 객체지향 쿼리언어(JPQL) (1) (0) | 2021.07.25 |