본문 바로가기

스터디/JPA

다양한 연관관계 매핑 - (2)

728x90
반응형

일대일


 

양쪽이 서로 하나의 관계만을 가진다

일대일 관계에서는 주 테이블과 대상 테이블 어느 곳이나 외래 키를 가질 수 있다

 

주 테이블에 외래 키

객체지향적 관점에서는 주 테이블에 외래 키가 있는 것을 선호한다

 

단방향

@Entity
public class Member {
	
	@Id @GeneratedValue
	@Column(name="MEMBER_ID")
	private Long id;
	
	private String username;
	
	@OneToOne
	@JoinColumn(name="LOCKER_ID")
	private Locker locker;
	...
}
@Entity
public class Locker {
	
	@Id @GeneratedValue
	@Column(name="LOCKER_ID")
	private Long id;
	
	private String name;
	...
}

일대일 관계이므로 객체 매핑에 @OneToOne을 사용했고, 외래 키 값이 유니크해야 하므로 데이터베이스에 유니크 제약 조건을 추가했다

 

양방향

@Entity
public class Locker {
	
	@Id @GeneratedValue
	@Column(name="LOCKER_ID")
	private Long id;
	
	private String name;
	
	@OneToOne(mappedBy="locker")
	private Member member;
	...
}

양방향이므로 연관관계의 주인을 정해야 하는데, 외래 키를 가지고 있는 Member.locker를 연관관계의 주인으로 한다

대상 테이블에 외래 키

단방향

일대일 관계 중 대상 테이블에 외래 키가 있는 단방향 관계는 JPA에서 지원하지 않는다

외래 키를 가지는 테이블과 연관관계를 가지는 엔티티가 다를 수 없다

 

양방향

대상 테이블에 외래 키를 두고 싶으면 양방향으로 매핑해야 한다

@Entity
public class Member {
	
	@Id @GeneratedValue
	@Column(name="MEMBER_ID")
	private Long id;
	
	private String username;
	
	@OneToOne(mappedBy="member")
	private Locker locker;
	...
}
@Entity
public class Locker {
	
	@Id @GeneratedValue
	@Column(name="LOCKER_ID")
	private Long id;
	
	private String name;
	
	@OneToOne
	@JoinColumn(name="MEMBER_ID")
	private Member member;
	...
}

주 엔티티 대신 대상 엔티티를 연관관계의 주인으로 만들어 대상 엔티티에서 외래 키를 관리하도록 했다

728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

고급 매핑 - (1)  (0) 2025.02.11
다양한 연관관계 매핑 - (3)  (0) 2025.02.11
다양한 연관관계 매핑 - (1)  (0) 2025.02.10
연관관계 매핑 기초 - (2)  (0) 2025.02.09
연관관계 매핑 기초 - (1)  (0) 2025.02.09