페치 조인 사용법JOIN FETCH 구문으로 연관 엔티티를 즉시 로딩JPQL은 연관 엔티티를 단순한 조인이 아니라즉시 로딩할 엔티티로 처리함@Test void testFetchJoin() { String jpql = "select m from Member m join fetch m.teams"; List resultList = em.createQuery(jpql, Member.class) .getResultList(); System.out.println("resultList = " + resultList); }페치 조인으로 팀을 조회한 경우팀 엔티티는 프록시 객체가 아니라실제 엔티티임.지연로딩이 발생하지 않는 것임.장점성능의 최적화페치 조인을 사용시 필요한 엔티티를 미리 로딩할 수 있음나중에 엔티티 접근..
컬렉션 페치 조인일대다 관계인 컬렉션을 함께 조회시 사용한다.연관된 엔티티들을 한번의 쿼리로 가져올 수 있음예시SELECT t FROM Team t JOIN FETCH t.members WHERE t.name = '팀A'실행된 SQLSELECT T.*, M.* FROM TEAM T INNER JOIN MEMBER M ON T.ID = M.TEAM_ID WHERE T.NAME = '팀A'TEAM 테이블과 MEMEBER 테이블을 내부 조인하여 팀A 에 소속된 모든 회원을 조회함@BeforeEach void setUp() { List teams = new ArrayList(); Team team = new Team(); team.setName("팀1"); em.persist(team); // 팀만들어주기 //..
페치조인은연관된 엔티티를 지연 로딩하지 않고 즉시 로딩할 수 있기에N+1 문제를 쉽게 해결할 수 있다는 점에서 유용하다..하지만, 이는 몇가지 한계가 있음페치 조인의 한계페이징 문제JPA 는 어플리케이션 레벨에서 페이징을 처리하게 됩니다.수많은 데이터를 가져와서 어플리케이션 레벨에서 페이징을 시도하면 어떻게 될까요많은 양은 데이터를 메모리에 올려놓게 되기에 성능에 문제가 발생할 수 있음관련 해결 방안은Hibernate Fetch Join시 메모리에서 페이징 처리 사전 차단하기Hibernate (Spring Data JPA) 를 사용하다보면 종종 HHH000104: firstResult/maxResults specified with collection fetch; applying in memory! 의 W..
개념@AttributeOverride임베디드 타입 내의 필드에 대한 매핑 정보를 오버라이드 할때 사용같은 임베디드 타입을 한 엔티티 내에서 여러 번 사용하고자 할 때 필요함같은 타입의 임베디드 필드가 테이블내에서 서로 다른 컬럼명을 가져야할 경우가 존재사례회원 엔티티 Member집 주소 homeAddress회사 주소 companyAddress집 주소 , 회사 주소는 모두 Address 타입입니다.데이터 베이스 테이블에 이를 매핑시 각 주소를 구분 O고유한 컬럼이 필요함@Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Embedded Address homeAddress; @Embedded @Attr..
@Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int age; }기본 자료형이나 그에 해당 하는 래퍼 클래스 (String 등) 을 기본값 타입 으로 정의해당 값들은 식별자를 가지지 않고, 엔티티의 생명주기에 종속엔티티 인스턴스가 삭제되는 경우 함께 삭제다른 엔티티와 공유되어서는 안됨. Uploaded by N2T
임베디드 타입JPA 에서 복합 값을 임베디드 타입을 통해 구현가능하다복합값?여러 값을 하나로 모아서 표현하는 값임베디드 타입엔티티에 속하는 값 타입으로, 복잡한 객체의 모델을 단순화할때 유용@Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Temporal(TemporalType.DATE) private Date startDate; @Temporal(TemporalType.DATE) private Date endDate; private String city; private String street; private String zipcode; //.... }위 코드의 경우 이름, 근무 시작일 종료일 ..