단방향 연관관계
@Entity
public class Member {
...
@ManyToOne(fetch = LAZY)
@JoinColumn(name="TEAM_ID")
private Team team;
}
음 보기 불편하니까 em.persis() 이런건 생략하겠습니다.
하지만 중요합니다!
Team team = new Team("teamName");
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
위처럼 team 자체를 넣어주면 된다.
양방향 연관관계
@Entity
public class Member {
...
@ManyToOne(fetch = LAZY)
@JoinColumn(name="TEAM_ID")
private Team team;
}
@Entity
public class Team {
...
@OneToMany(mappedBy = "team") -> Member의 team으로 매핑이 되어있다.
private List<Member> memberList = new ArrayList<>();
}
객체의 연관관계
- 회원 연관관계 1개
- 팀 연관관계 1개
⇒ 양쪽에 참조하는 값이 있음
테이블의 연관관계
회원에 team_id 하나만 있음
💯객체의 참조값이 양쪽에 있기 때문에 둘중에 하나로 외래 키를 관리해야한다
예시) 멤버에서 팀을 바꾸고 싶을 경우
- 멤버에 있는 team을 바꿔야하나?
- 팀에 있는 memberList를 바꿔야하나?
이런 문제가 있다.
결론적으로 말하자면
- 연관관계 주인(owner)
- 연관관계 주인만이 외래키를 관리(등록, 수정)
- 주인이 아니면 읽기만 가능
- 주인은 mappedBy 속성 X *****mappedBy속성은 읽기만 가능
- 💯외래키가 있는 곳을 주인으로!!!!
Team team = new Team("teamName");
Member member = new Member();
member.setUsername("member1");
// member.setTeam(team);
team.getMembers().add(member);
---
member.setTeam(team);
을 넣지 않으면 멤버에 team_id가 null임
주인이 아니면 읽기만 가능
*****mappedBy속성은 읽기만 가능
이것이 중요~!!!
양방향 연관관계 주의할점
- 항상 양쪽값을 세팅하자
- 연관관계 편의 메서드로 표현
Team team = new Team("teamName");
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
team.getMembers().add(member);
위에 두줄처럼 둘다 세팅해주는게 맞다!!
하나의 메서드로 표현
member.changeTeam(team);
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
또는
public void addMember(Member member) {
member.setTeam(this);
members.add(member);
}
- 양방향 매핑시 무한루프를 조심하자
Entity를 반환하지 말자!! dto로 변환해서 반환하자!!
'spring boot > JPA - 기본' 카테고리의 다른 글
| JPA - proxy(프록시) (0) | 2021.11.13 |
|---|---|
| JPA - 상속관계 매핑 (0) | 2021.11.08 |
| JPA - 연관관계 매핑(2) (0) | 2021.11.08 |
| jpa - 엔티티 매핑 (0) | 2021.10.21 |
| JPA - 기본 개념과 영속성 (0) | 2021.10.18 |