테이블
-> 외래키 하나로 양쪽 조인 가능
객체
-> 참조용 필드가 있는 쪽으로만 참조 가능
-> 한쪽만 참조하면 단방향
-> 양쪽이 서로 참조하면 양방향 -> 객체 입장에서는 단방향 총 2개의 단방향
예시 상황
1. 회원(Member) 와 팀(Team) 은 다대일
2. 회원(Member) 와 락커(Locker) 는 일대일
@ManyToOne
가장 많이 사용하는 연관관계
회원 엔티티에 외래키가 존재
단방향
-> 회원 엔티티에 팀 객체를 참조하는 형태
양방향
-> 외래키가 있는 회원 엔티티가 연관관계의 주인
-> 팀 엔티티에는 회원을 참조하는 컬렉션 생성
// Member.kt
@ManyToOne
@JoinColumn(name = "TEAM_ID")
var team: Team
// Team.kt
@OneToMany(mappedBy = "team")
val members: MutableList<Member> = arrayListOf()
// Team.kt
@OneToMany
@JoinColumn(name = "TEAM_ID")
val members: MutableList<Member> = arrayListOf()
// Member.kt
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
var team: Team
// Member.kt
@OneToOne
@JoinColumn(name = "LOCKER_ID")
var locker: Locker
// Locker.kt
@OneToOne(mappedBy = "locker")
var member: Member
일대일 정리
1. 주테이블 외래 키
- 주 객체가 대상 겍체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음
- 장점 : JPA 매핑이 편리, 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단점 : 값이 없으면 외래 키에 null 허용
- 대상 테이블에 외래 키
- 대상 테이블에 외래 키가 존재
- 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
- 단점 : 프로시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩 됨
// Member.kt
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT")
val products: MutableList<Product> = arrayListOf()
// Product.kt
@ManyToMany(mappedBy = "products")
val members: MutableList<Member> = arrayListOf()
// Member.kt
@OneToMany(mappedBy = "member")
val memberProducts: MutableList<MemberProduct> = arrayListOf()
// Product.kt
@OneToMany(mappedBy = "product")
val memberProducts: MutableList<MemberProduct> = arrayListOf()
// MemberProduct.kt
@Entity
class MemberProduct(
@Id
@GeneratedValue
val id: Long? = null,
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
var member: Member,
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
var product: Product,
var count: Int
)