<aside> ❗
<aside> ❗
<aside> ❗
[테이블]
외래 키 하나로 양쪽 조인 가능
방향이라는 개념이 없음
[객체]
참조용 필드가 있는 쪽으로만 참조 가능
한쪽만 참조하면 단방향
양쪽이 서로 참조하면 양방향
→ 단방향 두 개
</aside><aside> ❗
외래 키 하나
로 두 테이블이 연관관계를 맺음
참조가 2군데
연관관계의 주인 : 외래 키를 관리하는 참조
-> N 쪽이 외래 키를 가지므로 N 쪽인 곳에 참조 필드 추가
주인의 반대편
: 외래 키에 영향을 주지 않음, 단순 조회만 가능
- 읽기만 가능
</aside><aside> ❗
N 쪽에 외래키가 간다.
@ManyToOne
@JoinColumn(name = "TEAM_ID") // TEAM_ID는 외래키 이름
private Team team;
</aside>
<aside> ❗
List<N타입> 참조 변수를 생성하고 매핑을 걸면된다
.
이 때, **mappedby로 의존관계 주인의 객체이름으로 설정
**한다.반대쪽을 추가한다고 해서 테이블에 영향을 주지 않음 (읽기 전용)
****@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
</aside>
<aside> ❗
외래키 이름을 등록
한다.객체 이름을 등록
하면 된다.
</aside><aside> ❗
일이 연관관계의 주인
다 쪽에 외래 키가 있음
반대편 테이블의 외래 키를 관리하는 특이한 구조
// @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);
} ...
엔티티가 관리하는 외래 키가 다른 테이블에 있음
- 매우 큰 단점연관관계 관리를 위해 추가로 UPDATE SQL 실행
→ 다른 테이블의 값을 업데이트 해줘야하기 때문다대일 양방향 매핑을 사용하자!!
→ 객체적으로 손해를 보더라도 다대일 양방향 권장
</aside><aside> ❗
다대일 양방향을 사용하자
// 연관관계 주인을 정해주기 위해 insertable=false, updatable=false 옵션 추가
// 읽기 전용으로 설정
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable=false, updatable=false)
private Team team;
</aside>
<aside> ❗
일대일 관계는 그 반대도 일대일
유니크(UNI) 제약조건 추가
@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;
}