<aside> ❗

연관관계 매핑시 고려사항 3가지

<aside> ❗

다중성

<aside> ❗

단방향, 양방향

[테이블]

[객체]

<aside> ❗

연관관계 주인

<aside> ❗

다대일 [N : 1]

image.png

@ManyToOne
@JoinColumn(name = "TEAM_ID") // TEAM_ID는 외래키 이름 
private Team team;

</aside>

<aside> ❗

다대일 양방향

image.png

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();

</aside>

<aside> ❗

정리

<aside> ❗

일대다

일대다 단방향

image.png



일대다 단방향

// @JoinColumn은 외래키로 사용할 컬럼명을 명시적으로 지정해주는 것
// 외래키의 컬럼명을 name으로 전달해주는 것 
@OneToMany
@JoinColumn(name = "TEAM_ID")
List<Member> members = new ArrayList<>();
try {
	Member member = new Member();
	member.setUsername("member1");
	
	em.persist(member);
	
	Team team = new Team();
	team.setName("TeamA");
	
	// 팀 테이블에 List를 저장하는 컬럼 없음
	// 그러므로 외래키가 있는 Member 테이블에 업데이트 해준다. 
	// 다대일보다 쿼리가 한 번 더 나감 
	team.getMembers().add(member); 
	
} ...

일대다 단방향 정리

<aside> ❗

일대다 양방향 - 그냥 이런게 있구나하고 넘어가라

image.png

// 연관관계 주인을 정해주기 위해 insertable=false, updatable=false 옵션 추가
// 읽기 전용으로 설정
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable=false, updatable=false)
private Team team;

</aside>

<aside> ❗

일대일 관계

image.png

양방향

image.png

@Entity
public class Locker {
		@Id @GeneratedValue
		@Column(name = "LOCKER_ID")
		private Long id;
		
		@Column(name = "NAME")
		private String name;
		
		// 양방향 구현 시 
		@OneToOne(mappedBy = "locker")
		Member member;
}
@Entity
public class Member {
		@Id @GeneratedValue
		@Column(name = "MEMBER_ID")
		private Long id;
		
		// 단방향 구현 시 
		@OneToOne
		@JoinColumn(name = "LOCKER_ID")
		Locker locker;
		
		@Column(name = "USERNAME")
		private String name;
}

일대일 - 주 테이블에 외래 키 양방향 정리