일대일
03 Jan 2019일대일
- 일대일 관계는 그 반대도 일대일 관계다.
- 주 테이블이나 대상 테이블 중 어느 곳이나 외래 키를 가질 수 있다.
주 테이블에 외래 키
단방향
회원 엔티티
@Entity
class Member(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
val id: Long = 0L,
val username: String,
@OneToOne
@JoinColumn(name = "LOCKER_ID")
val locker: Locker
)
사물함 엔티티
@Entity
class Locker(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "LOCKER_ID")
val id: Long = 0L,
val name: String
)
양방향
회원 엔티티
@Entity
class Member(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
val id: Long = 0L,
val username: String,
@OneToOne
@JoinColumn(name = "LOCKER_ID")
val locker: Locker
)
사물함 엔티티
@Entity
class Locker(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "LOCKER_ID")
val id: Long = 0L,
val name: String,
@OneToOne(mappedBy = "locker")
val member: MEMBER
)
대상 테이블에 외래 키
단방향
주 테이블에서 대상 테이블을 찾을 수 없기 때문에 주 테이블과 대상 테이블의 방향을 수정하거나 양방향 관계로 대상 테이블을 연관관계의 주인으로 설정해야 한다.
양방향
회원 엔티티
@Entity
class Member(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
val id: Long = 0L,
val username: String,
@OneToOne(mappedBy = "member")
val locker: Locker
)
사물함 엔티티
@Entity
class Locker(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "LOCKER_ID")
val id: Long = 0L,
val name: String,
@OneToOne
@JoinColumn(name = "MEMBER_ID")
val member: MEMBER
)
자식 테이블의 기본 키 값으로 부모 테이블의 키 값만 사용한다면
게시판 엔티티
@Entity
class Board(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "BOARD_ID")
val id: Long = 0L,
val title: String,
@OneToOne(mappedBy = "board")
val boardDetail: BoardDetail
)
게시판 상세 엔티티
@Entity
class BoardDetail(
@Id
val boardId: Long = 0L,
val content: String,
@MapsId // BoardDetail.boardId 매핑
@OneToOne
@JoinColumn(name = "BOARD_ID")
val board: Board
)
@MapsId는 @Id를 사용해서 식별자로 지정한 BoardDetail.boardId와 매핑된다.