티스토리 뷰

반응형


| 엔티티 그래프



엔티티 조회시점에 연관된 엔티티들을 함께 조회하는 기능

- 정적으로 정의하는 Named 엔티티 그래프

- 동적으로 정의하는 엔티티 그래프



|| 정적 엔티티 그래프(Named)



c. 주문을 조회 시 연관된 회원도 함께 조회하는 엔티티 그래프 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@NamedEntityGraph(name = "Order.withMember", attributeNodes = {
    @NamedAttributeNode("member")
})
@Entity
@Table(name = "ORDERS")
public class Order {
 
    @Id
    @GeneratedValue
    @Column(name = "ORDER_ID")
    private Long id;
 
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "MEMBER_ID")
    private Member member;  // 주문 회원
 
    //..
}
cs


@NamedEntityGraph : Named 엔티티 그래프 정의

name : 엔티티 그래프 이름 정의

attributeNodes : 함께 조회할 속성 선택


* Order.member가 지연 로딩으로 설정되어 있지만, 엔티티 그래프에서 함께 조회할 속성으로 member를 선택했으므로

이 엔티티 그래프를 사용하면 Order를 조회할 때 연관된 member도 함께 조회 가능

* 엔티티 그래프를 둘 이상 정의할 경우 @NamedEntityGraphs 사용


c. em.find()에서 엔티티 그래프 사용

1
2
3
4
5
6
EntityGraph graph = em.getEntityGraph("Order.withMember");
 
Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", graph);
 
Order order = em.find(Order.class, orderId, hints);
cs


em.getEntityGraph("") : 정의한 엔티티 그래프 찾기

hints.put("", ) : 엔티티 그래프는 JPA의 힌트 기능을 사용해서 동작

힌트의 값으로 찾아온 엔티티 그래프 사용

em.find() : 엔티티 그래프 사용


||| subgraph



Order -> OrderItem -> Item 조회

c. subgraph 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@NamedEntityGraph(name = "Order.withAll", attributeNodes = {
    @NamedAttributeNode("member"),
    @NamedAttributeNode(value = "orderItems", subgraph = "orderItems")
    },
    subgraphs = @NamedSubgraph(name = "orderItems", attributeNodes = {
        @NamedAttributeNode("item")
    })
)
@Entity
@Table(name = "ORDERS")
public class Order {
 
    @Id
    @GeneratedValue
    @Column(name = "ORDER_ID")
    private Long id;
 
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "MEMBER_ID")
    private Member member;  // 주문 회원
 
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<OrderItem>();
    
    // ...
}
 
@Entity
@Table(name = "ORDER_ITEM")
public class OrderItem {
 
    @Id
    @GeneratedValue
    @Column(name = "ORDER_ITEM_ID")
    private Long id;
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ITEM_ID")
    private Item item;  // 주문 상품
 
    // ..
}
cs


"Order.All"이라는 Named 엔티티 그래프 정의

: 아래 객체 그래프를 함께 조회

- Order -> Member

- Order -> OrderItem

- OrderItem -> Item  (Order의 객체 그래프가 아니므로 subgraphs 속성에 정의)


c. orderItem -> Item 조회

1
2
3
4
Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", em.getEntityGraph("Order.withAll"));
 
Order order = em.find(Order.class, orderId, hints);
cs


||| JPQL에서 엔티티 그래프 사용



em.find()와 동일하게 힌트만 추가

1
2
3
4
5
6
List<Order> resultList =
    em.createQuery("select o from Order o where o.id = :orderId",
        Order.class)
      .setParameter("orderId", orderId)
      .setHint("javax.persistence.fetchgraph", em.getEntityGraph("Order.withAll"))
      .getResultList();
cs




|| 동적 엔티티 그래프



엔티티 그래프를 동적으로 구성하려면 createEntityGraph() 메소드 사용


c. 동적 엔티티 그래프 구성

1
2
3
4
5
6
7
EntityGraph<Order> graph = em.createEntityGraph(Order.class);
graph.addAttributeNodes("member");    
 
Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", graph);
 
Order order = em.find(Order.class, orderId, hints);
cs


c. 동적 엔티티 그래프 subgraph

1
2
3
4
5
6
7
8
9
EntityGraph<Order> graph = em.createEntityGraph(Order.class);
graph.addAttributeNodes("member");
Subgraph<OrderItem> orderItems = graph.addSubgraph("orderItems");
orderItems.addAttributeNodes("item");
 
Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", graph);
 
Order order = em.find(Order.class, orderId, hints);
cs





출처 : 자바 ORM 표준 JPA 프로그래밍


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday