JPA 21

[JPA 20] 영속성 전이(CASCADE)

CASCADEEntity의 영속 상태를 변경할 때, 연관 Entity도 같이 변경하고 싶은 경우 사용사용 조건다음 조건을 만족하지 않으면 사용하면 안됨연관 Entity를 사용하는 곳이 현재 Entity 밖에 없어야 함(다른 테이블에서 사용하면 안됨)현재 Entity와 연관 Entity의 Lifecycle이 같아야 함(생성, 수정, 삭제 등)사용 방법@Entitypublic class Member { /* ... */ @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "team_id") private Team team;}연관관계 어노테이션의 cascade 엘리먼트에 CascadeType 적용연관관계의 참조측(mappedBy)도 사용 ..

JPA 2022.03.12

[JPA 19] 즉시 로딩 / 지연 로딩

즉시 로딩@Entitypublic class Member { /* ... */ @ManyToOne(fetch = FetchType.EAGER) private Team team;}연관관계 어노테이션의 fetch 엘리먼트를 FetchType.EAGER로 설정항상 JOIN 쿼리로 연관관계 Entity 매핑프록시 객체 사용하지 않음지연 로딩@Entitypublic class Member { /* ... */ @ManyToOne(fetch = FetchType.LAZY) private Team team;}연관관계 어노테이션의 fetch 엘리먼트를 FetchType.LAZY로 설정객체를 사용하는 시점(Ex. Entity의 ID를 제외한 필드를 getter 등으로 불러오는 시점)에 D..

JPA 2022.03.11

[JPA 18] 프록시(Proxy)

프록시란?사전적 정의: 대리, 대리인Hibernate 프록시JPA 표준 스펙에 프록시와 관련된 내용은 없다JPA의 구현체인 Hibernate의 기능사용 이유DB에서 Member 테이블만 조회할 때 의미 없이 다른 테이블 JOIN을 걸지 않듯이, JPA에서도 Member만 조회할 때 Team을 같이 조회한다면 성능 면에서 손해무의미한 쿼리를 줄여 성능을 향상시키기 위해 사용한다Hibernate 프록시 작동 방식entityManager.find(): 실제 Entity 쿼리entityManager.getReference(): 프록시 객체를 통한 쿼리Hibernate 프록시는 실제 Entity를 상속받는다타입 체크할 때 ==로 비교하면 실패하므로 instanceof로 비교프록시 객체 내부에는 상속받은 원본 En..

JPA 2022.03.11

[JPA 17] 공통 컬럼 관리 - @MappedSuperClass

@MappedSuperClass@MappedSuperClasspublic abstract class CommonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private LocalDateTime createdAt; private LocalDateTime updatedAt;}id, 등록일, 수정일, 등록한 사람, 수정한 사람 등 많은 Entity에서 공통으로 사용하는 컬럼을 모아놓은 클래스@MappedSuperClass 클래스를 @Entity 클래스가 상속 받으면 테이블에 컬럼이 추가된다JPA의 @Entity 클래스는 @Entity 클래스와 @MappedSuperClass 클래스..

JPA 2022.03.11

[JPA 13] 상속관계 구현

DB와 객체의 상속관계형 데이터베이스는 상속 개념이 존재하지 않는다객체에는 상속 개념이 존재한다슈퍼-서브타입 모델로 객체의 상속관계를 구현할 수 있다Entity Annotation@Inheritance(strategy = InheritanceType.???)JOINED: 조인 전략SINGLE_TABLE: 싱글 테이블(통합 테이블) 전략TABLE_PER_CLASS: 클래스 별 테이블(서브타입 테이블) 전략@DiscriminatorColumn슈퍼타입의 식별자 컬럼기본값은 DTYPE이며 서브타입의 유형을 구분하는 용도로 사용name 엘리먼트로 컬럼명 지정 가능@DiscriminatorValue서브타입의 식별자 값슈퍼타입의 식별자 컬럼에 저장할 테이블 유형 값value 엘리먼트로 값 지정 가능

JPA 2022.03.11

[JPA 12] 연관관계 - @ManyToMany

N:M 관계 (Many-To-Many)DB의 N:M 관계DB에서 N:M 관계는 2개의 테이블로 구현 불가능하며 중간에 연결 테이블을 사용학생 테이블1명의 학생은 N개의 수업을 들을 수 있다수업 테이블하나의 수업은 M명의 학생을 가질 수 있다학생_수업 테이블학생 테이블과 N:1 관계수업 테이블과 M:1 관계객체의 N:M 관계객체에서 N:M 관계는 Collection을 서로 참조하면 되기 때문에 2개의 객체로 구현 가능구현@Entitypublic class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany @JoinTab..

JPA 2022.03.10