public interface ProductRepository extends JpaRepository<Product, Long> {
}
엔티티를 영구 저장 하는 환경
어플리케이션이 데이터베이스에서 꺼내온 데이터 객체를 보관하는 역할
엔티티를 조회하거나 저장할 때 보관, 관리
식별자로 엔티티 관리, 구분
JPA 엔티티의 상태
** 플러시(fluch()
) - 영속성 컨텍스트의 변경 내용을 DB에 반영하는 연산
1차캐시
쓰기 지연 SQL 저장소
DirtyChecking
데이터의 어플리케이션 단의 동일성 보장
관계 | 코드선언 | Entity | 예 |
---|---|---|---|
일대다 (1:N) | @OneToMany | Order (1) : Food (N) | 배달 주문 1개에 음식 여러개 선택 가능 |
다대일 (N:1) | @ManyToOne | Owner (N) : Restaurant(1) | 음식점 주인 여러명이 하나의 음식점을 소유 가능 |
일대일 (1:1) | @OneToOne | Order (1) : Coupon (1) | 배달 주문 1개 주문 시, 쿠폰 1개만 할인 적용 가능 |
다대다 (N:N) | @ManyToMany | User (N) : Restaurant(N) | 고객은 음식점 여러개 찜 가능 |
음식점은 고객 여러명에게 찜 가능 |
단방향 연관관계
@Entity
@Getter
@Setter
public class Member {
@Id
@Column(name = "member_id")
private String id;
private String username;
@ManyToOne
@JoinColumn(name="team_id")
private Team team; //Member 여럿이 team하나에 할당
public void setTeam(Team team) {
this.team = team;
}
}
@ManyToOne
주요 속성; optional, fetch, cascade
- optional
: false로 설정하면 항상 연관된 엔티티가 있어야 생성 가능
- fetch? cascade?
@JoinColumn(name="team_id")
외래키 매핑 시 사용
@Column이 가지는 필드 매핑관련 옵션 설정 + 외래키 관련 옵션
양방향 연관관계
@Getter
@Entity
@NoArgsConstructor
public class Member {
...
@OneToMany(mappedBy = "member", fetch = FetchType.EAGER)
private List<Orders> orders = new ArrayList<>();
...
}
}
@Getter
@Entity
@NoArgsConstructor
public class Orders { //연관관계 주인
...
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
...
}
}
프록시(Proxy)
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
@ManyToOne, @OneToOne: 즉시 로딩(FetchType.EAGER)
@OneToMany, @ManyToMany: 지연 로딩(FetchType.LAZY)
영속성 전이
특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 함께 만들 수 있음
JPA에서 cascade옵션을 사용하여 제공
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
private List<Address> addresses;
reference
김영한, 『자바 ORM 표준 JPA 프로그래밍』