실제 클래스를 상속받아 만들어짐. 겉모양이 같음. → 사용자 입장에서는 구분하지 않고 사용.
값이 사용될 때 ← 초기화됨. 1번만
원본 엔티티를 상속받음. 타입체크시 비교 실패(==). instanceof 사용
이미, 영속성 컨테스트에 있으면 → 해당 인스턴스 그대로 가져옴m2 = em.getReference // member 클래스 2. m1 = em.getReference // member.hibernateproxy 클래스 m2 = em.find // member.hibernateproxy 클래스
ex) 1. m1 = em.find // member 클래스
즉시로딩 vs 지연로딩 ★ → 실무에서 모두 지연로딩 설정
→ Member를 조회할 때 Team도 조회를 해야할까?
지연로딩 (fetch = FetchType.LAZY) // 가급적 지연로딩만 사용
m.getTeam() 할때 초기화됨.
ManyToOne, OneToOne → LAZY설정
즉시로딩 (fetch = FetchType.EAGER) // N+1 문제
예상치 못한 SQL 에러
CASCADE : 영속성 전이
ALL, PERSIST, REMOVE
1개의 부모와 자식들을 관리할때 사용
CASCADE는 연관관계를 매핑하는 것과 아무 관련이 없음
엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐
임베디드 타입
String 시티, 거리, 위치 → Address 클래스
장점
재사용
높은 응집도
값타입(int, String...)
사용법
정의 : @Embeddable
사용 : @Embedded
값 타입 비교
동일성(==) : 참조값 비교
동등성(equals()) : 인스턴스 값 비교
값 타입 컬렌션
: Entity의 List, Set → 새로운 Table (하나의 테이블에 여러 값 넣을 수 없기에)
//페이징 쿼리 String jpql = "select m from Member m order by m.name desc"; List<Member> resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList();
서브쿼리
종류
EXISTS (서브쿼리) : 결과가 존재하면 참
ALL, ANY, SOME (서브쿼리)
ALL : 모두 만족
ANY=SOME : 1개라도 만족하면 참
IN (서브쿼리)
한계
현재 JPQL의 from 절에서는 서브쿼리 불가
// m, m2 <- 다르게 구분해야함 select m from Member m where m.age > (select avg(m2.age) from Member m2
조건식
// CASE식 select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m
조인
명시적 조인 : 사용하기
묵시적 조인 : 사용X
fetch join ★
(left) join fetch
select m from Member m join fetch m.team
컬렉션(list)을 fetch join할 경우 @batchSize로 한번에 넘겨줌도메인 모델. 예제
실제 클래스를 상속받아 만들어짐. 겉모양이 같음. → 사용자 입장에서는 구분하지 않고 사용.
값이 사용될 때 ← 초기화됨. 1번만
원본 엔티티를 상속받음. 타입체크시 비교 실패(==). instanceof 사용
이미, 영속성 컨테스트에 있으면 → 해당 인스턴스 그대로 가져옴m2 = em.getReference // member 클래스 2. m1 = em.getReference // member.hibernateproxy 클래스 m2 = em.find // member.hibernateproxy 클래스
//페이징 쿼리 String jpql = "select m from Member m order by m.name desc"; List<Member> resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList();
서브쿼리
종류
EXISTS (서브쿼리) : 결과가 존재하면 참
ALL, ANY, SOME (서브쿼리)
ALL : 모두 만족
ANY=SOME : 1개라도 만족하면 참
IN (서브쿼리)
한계
현재 JPQL의 from 절에서는 서브쿼리 불가
// m, m2 <- 다르게 구분해야함 select m from Member m where m.age > (select avg(m2.age) from Member m2
조건식
// CASE식 select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m조인
명시적 조인 : 사용하기
묵시적 조인 : 사용X
fetch join ★
(left) join fetch
select m from Member m join fetch m.team
컬렉션(list)을 fetch join할 경우 @batchSize로 한번에 넘겨줌도메인 모델. 예제
실제 클래스를 상속받아 만들어짐. 겉모양이 같음. → 사용자 입장에서는 구분하지 않고 사용.
값이 사용될 때 ← 초기화됨. 1번만
원본 엔티티를 상속받음. 타입체크시 비교 실패(==). instanceof 사용
이미, 영속성 컨테스트에 있으면 → 해당 인스턴스 그대로 가져옴m2 = em.getReference // member 클래스 2. m1 = em.getReference // member.hibernateproxy 클래스 m2 = em.find // member.hibernateproxy 클래스
//페이징 쿼리 String jpql = "select m from Member m order by m.name desc"; List<Member> resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList();
서브쿼리
종류
EXISTS (서브쿼리) : 결과가 존재하면 참
ALL, ANY, SOME (서브쿼리)
ALL : 모두 만족
ANY=SOME : 1개라도 만족하면 참
IN (서브쿼리)
한계
현재 JPQL의 from 절에서는 서브쿼리 불가
// m, m2 <- 다르게 구분해야함 select m from Member m where m.age > (select avg(m2.age) from Member m2
조건식
// CASE식 select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m조인
명시적 조인 : 사용하기
묵시적 조인 : 사용X
fetch join ★
(left) join fetch
select m from Member m join fetch m.team
컬렉션(list)을 fetch join할 경우 @batchSize로 한번에 넘겨줌도메인 모델. 예제
실제 클래스를 상속받아 만들어짐. 겉모양이 같음. → 사용자 입장에서는 구분하지 않고 사용.
값이 사용될 때 ← 초기화됨. 1번만
원본 엔티티를 상속받음. 타입체크시 비교 실패(==). instanceof 사용
이미, 영속성 컨테스트에 있으면 → 해당 인스턴스 그대로 가져옴m2 = em.getReference // member 클래스 2. m1 = em.getReference // member.hibernateproxy 클래스 m2 = em.find // member.hibernateproxy 클래스
//페이징 쿼리 String jpql = "select m from Member m order by m.name desc"; List<Member> resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList();
서브쿼리
종류
EXISTS (서브쿼리) : 결과가 존재하면 참
ALL, ANY, SOME (서브쿼리)
ALL : 모두 만족
ANY=SOME : 1개라도 만족하면 참
IN (서브쿼리)
한계
현재 JPQL의 from 절에서는 서브쿼리 불가
// m, m2 <- 다르게 구분해야함 select m from Member m where m.age > (select avg(m2.age) from Member m2
조건식
// CASE식 select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m조인
명시적 조인 : 사용하기
묵시적 조인 : 사용X
fetch join ★
(left) join fetch
select m from Member m join fetch m.team
컬렉션(list)을 fetch join할 경우 @batchSize로 한번에 넘겨줌도메인 모델. 예제
실제 클래스를 상속받아 만들어짐. 겉모양이 같음. → 사용자 입장에서는 구분하지 않고 사용.
값이 사용될 때 ← 초기화됨. 1번만
원본 엔티티를 상속받음. 타입체크시 비교 실패(==). instanceof 사용
이미, 영속성 컨테스트에 있으면 → 해당 인스턴스 그대로 가져옴m2 = em.getReference // member 클래스 2. m1 = em.getReference // member.hibernateproxy 클래스 m2 = em.find // member.hibernateproxy 클래스
//페이징 쿼리 String jpql = "select m from Member m order by m.name desc"; List<Member> resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList();
서브쿼리
종류
EXISTS (서브쿼리) : 결과가 존재하면 참
ALL, ANY, SOME (서브쿼리)
ALL : 모두 만족
ANY=SOME : 1개라도 만족하면 참
IN (서브쿼리)
한계
현재 JPQL의 from 절에서는 서브쿼리 불가
// m, m2 <- 다르게 구분해야함 select m from Member m where m.age > (select avg(m2.age) from Member m2
조건식
// CASE식 select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m조인
명시적 조인 : 사용하기
묵시적 조인 : 사용X
fetch join ★
(left) join fetch
select m from Member m join fetch m.team
컬렉션(list)을 fetch join할 경우 @batchSize로 한번에 넘겨줌도메인 모델. 예제
실제 클래스를 상속받아 만들어짐. 겉모양이 같음. → 사용자 입장에서는 구분하지 않고 사용.
값이 사용될 때 ← 초기화됨. 1번만
원본 엔티티를 상속받음. 타입체크시 비교 실패(==). instanceof 사용
이미, 영속성 컨테스트에 있으면 → 해당 인스턴스 그대로 가져옴m2 = em.getReference // member 클래스 2. m1 = em.getReference // member.hibernateproxy 클래스 m2 = em.find // member.hibernateproxy 클래스
//페이징 쿼리 String jpql = "select m from Member m order by m.name desc"; List<Member> resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList();
서브쿼리
종류
EXISTS (서브쿼리) : 결과가 존재하면 참
ALL, ANY, SOME (서브쿼리)
ALL : 모두 만족
ANY=SOME : 1개라도 만족하면 참
IN (서브쿼리)
한계
현재 JPQL의 from 절에서는 서브쿼리 불가
// m, m2 <- 다르게 구분해야함 select m from Member m where m.age > (select avg(m2.age) from Member m2
조건식
// CASE식 select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m조인
명시적 조인 : 사용하기
묵시적 조인 : 사용X
fetch join ★
(left) join fetch
select m from Member m join fetch m.team
컬렉션(list)을 fetch join할 경우 @batchSize로 한번에 넘겨줌
실무 → QueryDSL 사용
: Entity의 List, Set → 새로운 Table (하나의 테이블에 여러 값 넣을 수 없기에)
→ Member를 조회할 때 Team도 조회를 해야할까?
→ 공통매핑정보가 사용될 때
공통수퍼클래스 ( @MappedSuperclass )
용어 이해
실무 → QueryDSL 사용
: Entity의 List, Set → 새로운 Table (하나의 테이블에 여러 값 넣을 수 없기에)
→ Member를 조회할 때 Team도 조회를 해야할까?
→ 공통매핑정보가 사용될 때
공통수퍼클래스 ( @MappedSuperclass )
용어 이해
실무 → QueryDSL 사용
: Entity의 List, Set → 새로운 Table (하나의 테이블에 여러 값 넣을 수 없기에)
→ Member를 조회할 때 Team도 조회를 해야할까?
→ 공통매핑정보가 사용될 때
공통수퍼클래스 ( @MappedSuperclass )
용어 이해
실무 → QueryDSL 사용
: Entity의 List, Set → 새로운 Table (하나의 테이블에 여러 값 넣을 수 없기에)
→ Member를 조회할 때 Team도 조회를 해야할까?
→ 공통매핑정보가 사용될 때
공통수퍼클래스 ( @MappedSuperclass )
용어 이해
실무 → QueryDSL 사용
: Entity의 List, Set → 새로운 Table (하나의 테이블에 여러 값 넣을 수 없기에)
댓글