일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- @Entity
- KAKAOLOGINAPI
- HTTP3
- @Table
- gitreset
- 네이버 연결된 서비스
- 네이버로그인API
- http
- HTTPMESSAGE
- DB방언
- RFC723x
- 무상태프로토콜
- Invalid bound statement (not found)
- SpringBoot
- Transaction not successfully started
- gitrevert
- 매핑정보가없는필드
- 자바ORM표준프로그래밍
- org.apache.ibatis.binding.BindingException
- 데이터베이스 방언
- hibernate.dialect
- 멱등활용
- JPA
- Git
- 김영한JPA
- fixedDelay
- 캐쉬가능
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- anyMatch
- initialDelay
- Today
- Total
twocowsong
다 대 일 본문
N : 1 관계의 반대 방향은 항상 1 : N 관계입니다. 반대도 항상 동일합니다.
DB 테이블의 1, N 관계에서 외래 키는 항상 N쪽에 있습니다.
따라서 객체 양방향 관계에서 연관관계의 주인은 항상 N쪽입니다.
예를들어 회원(N)과 팀(1)이 있으면 회원 쪽이 연관관계의 주인입니다.
N : 1 [ 다대일 단방향 ]
회원은 Member.team으로 팀 엔티티를 참조할 수 있지만
반대로 팀에는 회원을 참조하는 필드가 없습니다.
따라서 회원과 팀은 N : 1 단방향 연관관계입니다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
@JoinColumn(name = "TEAM_ID")를 사용해서 Member.team필드를 TEAM_ID외래 키와 매핑했습니다.
따라서 Member.team필드로 회원 테이블의 TEAM_ID외래키를 관리하게됩니다.
N : 1, 1 : N [ 다대일 양방향 ]
객체의 연관관계의 주인은 Member.team이고 Team.members은 연관관계의 주인이 아닙니다.
public class Member {
@Id
@Column(name="MEMBER_ID")
private String id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
// 연관관계 설정
public void setTeam(Team team) {
this.team = team;
if (!team.getMembers().contains(this)) {
team.getMembers().add(this);
}
}
// Getter, Setter...
}
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public void addMember(Member members) {
this.members.add(members);
if (members.getTeam() != this) {
members.setTeam(this);
}
}
}
양방향은 외래키가 있는 쪽이 연관관계의 주인입니다.
1 : N, N : 1 연관관계는 항상 N에 외래키가 있습니다.
여기서 N 쪽인 MEMBER테이블이 외래 키를 가지고있으므로 Member.team이 연관관계의 주인입니다.
JPA는 외래 키를 관리할 때 연관관계의 주인만 사용합니다.
주인이 아닌 Team.members는 조회를 위한 JPQL이나 객체 그래프를 탐색할 때 사용합니다.
양방향 연관관계는 항상 서로를 참조해야 합니다.
어느 한 쪽만 참조하면 양방향 연관관계가 성립되지 않습니다.
setTeam(), addMember() 메소드가 이런 편의 메소드들입니다.
이런편의 메소드들을 사용할때는 무한루프에 빠지지지않도록 주의해야합니다.