FoodEntity
와 StoreEnttiy
는 N:1 관계로 참조관계에 있다.
/*
Food Entity
*/
package com.jpastudy.ms.domain.Entity;
import lombok.Getter;
import javax.persistence.*;
@Getter
@Entity
@Table(name = "tb_test_food")
public class FoodEntity {
@Id
@Column(name="food_id")
private String foodId;
private String foodName;
private String foodCalorie;
@ManyToOne(fetch = FetchType.LAZY) // 지연 로딩
@JoinColumn(name = "store_id")
public StoreEntity storeEntity;
}
/*
Store Entity
*/
package com.jpastudy.ms.domain.Entity;
import lombok.Getter;
import javax.persistence.*;
@Getter
@Entity
@Table(name = "tb_test_store")
public class StoreEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String storeId;
private String storeName;
private String storeNumber;
private String address;
}
N:1 관계이지만 FoodEntity를 조회할 때 항상 FoodEntity를 조회하기 위해 쿼리를 날릴 필요는 없다.
@Test
public void proxyTest(){
FoodEntity foodEntity = em.find(FoodEntity.class,5L); // food_id 값이 5L인 데이터를 찾는다.
System.out.println(foodEntity.getStoreEntity().getClass());
em.close();
}
class com.jpastudy.ms.domain.Entity.StoreEntity$HibernateProxy$w7bUtIS5
FoodEntity 조회시 StoreEntity는 HibernateProxy
객체 형체로 조회되며 StoreProxy
초기화 및 호출시 영속성 컨텍스트
를 조회하고
Proxy
객체를 통해 실제 객체로 접근한다.@ManyToOne(fetch = FetchType.LAZY) // 지연로딩
@JoinColumn(name = "store_id")
public StoreEntity storeEntity;
@ManyToOne(fetch = FetchType.EAGER) // 즉시로딩
@JoinColumn(name = "store_id")
public StoreEntity storeEntity;
실무에서 Entity간의 관계는 지연로딩 (fetch = FecthType.LAZY) 설정으로 적용 되어야 한다.
그 이유는 AEnttiy.class 에 BEntity, CEntity 여러개의 연관관계가 매핑되어 있을 경우 즉시 로딩 설정을 하게 되면 (fetch = FecthType.EAGER) 그 연관관계 전체에 대한 쿼리가 나가고 이는 성능 이슈가 발생할 수 있기 때문이다.
즉 어떤 쿼리가 나갈지 모르기 때문이다.