์ฐ๊ด๊ด๊ณ ๋งคํ
๊ฐ์ฒด์ ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ์ ์ฐจ์ด๋ฅผ ์ดํดํ์
๊ฐ์ฒด์ ์ฐธ์กฐ์ ํ ์ด๋ธ์ ์ธ๋ ํค๋ฅผ ๋งคํ
๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋ง์ถ์ด ๋ชจ๋ธ๋ง (์ฐ๊ด๊ด๊ณ๊ฐ ์๋ ๊ฐ์ฒด)
Team
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
@Column(name = "TEAM_NAME")
private String name;
}
Member
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId;
}
@Column(name = "TEAM_ID")
private Long teamId;
teamId ๋ฅผ team ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋์ ์ ์ธ๋ํค๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ์๋ค
member.setTeamId(team.getId());
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
์๋ณ์๋ก ๋ค๋ฃจ๊ณ ๋ค์ ์กฐํํ๋ ๊ฒ์ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ค๊ณ๊ฐ ์๋๋ค .
๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ๋ง์ถ์ด ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ๋ชจ๋ธ๋งํ๋ฉด, ํ๋ ฅ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค.
๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค
๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
private Team team;
}
์๋ณ์์ธ teamId ๊ฐ ์๋
์ฐธ์กฐ๊ฐ์ธ team ์ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ค
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
@ManyToOne : Member ์ Team ์ N:1 ๊ด๊ณ (ํ๋์ ํ์ ์ฌ๋ฌ ๋ฉค๋ฒ๊ฐ ์์)
@JoinColumn(name = "TEAM_ID") :
team ์ MEMBER ํ ์ด๋ธ์ TEAM_ID(FK) ๋ ๋งคํ์ ํด์ผํ๋ค .
member.setTeam(team);
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
์๋ณ์๋ก ๋ค๋ฃจ๊ณ , ์๋ณ์๋ก ์กฐํํ๋ ๊ฒ์ด ์๋๋ผ
์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ
์๋ฐฉํฅ ๋งคํ
์์ชฝ์์ ์ฐธ์กฐ๊ฐ๋ฅํ ๊ด๊ณ
ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ์์๋ ๋ณํ ๊ฒ์ด ์๋ค
--> ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ ์ธ๋ํค(FK) ํ๋๋ก ์๋ฐฉํฅ์ด ๋ค ์๋ค , ์ฌ์ค์ ๋ฐฉํฅ์ด๋ผ๋ ๊ฐ๋ ์ด ์๋ค
MEMBER ์์ ๋ด๊ฐ ์์๋ ํ์ ์๊ณ ์ถ์ผ๋ฉด TEAM_ID(FK) ์ TEAM_ID(PK)๋ฅผ join ํ๋ฉด ์์ ์๋ค.
๋ฐ๋๋ก ์์๋ ํ์์ ์ด๋ค ๋ฉค๋ฒ๋ค์ด ์๋์ง๋ ๋๊ฐ๋ค .
๋ฌธ์ ๋ ๊ฐ์ฒด์ด๋ค .
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
TEAM ์์ MEMBER ๋ฅผ ์ฐธ์กฐํ ๋ฐฉ๋ฒ์ด ์์ผ๋ List members ๋ฅผ ๋ง๋ค์ด ์ค์ผ ํ๋ค .
@OneToMany : 1:N ๊ด๊ณ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๊ณผ mappedBy
๊ฐ์ฒด์ ํ ์ด๋ธ์ด ๊ด๊ณ๋ฅผ ๋งบ๋ ์ฐจ์ด
ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ
ํ์ <--> ํ (์๋ฐฉํฅ) / 1๊ฐ
ํ ์ด๋ธ์ ์ธ๋ํค ํ๋๋ก ๋ ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ค.
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
MEMBER.TEAM_ID ์ธ๋ํค ํ๋๋ก ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค ( ์์ชฝ์ผ๋ก ์กฐ์ธํ ์ ์๋ค. )
๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ
ํ์ -> ํ (๋จ๋ฐฉํฅ) / ํ -> ํ์ (๋จ๋ฐฉํฅ)
๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๊ฐ 2๊ฐ๊ฐ ์๋ ๊ฒ์ด๋ค .
๊ฐ์ฒด์ ์๋ฐฉํฅ ๊ด๊ณ๋ ์ฌ์ค ์๋ฐฉํฅ ๊ด๊ณ๊ฐ ์๋๋ผ ์๋ก ๋ค๋ฅธ ๋จ๋ฐฉํฅ ๊ด๊ณ 2๊ฐ๋ค.
๊ฐ์ฒด๋ฅผ ์๋ฐฉํฅ์ผ๋ก ์ฐธ์กฐํ๋ ค๋ฉด ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ 2๊ฐ ๋ง๋ค์ด์ผ ํ๋ค .
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ(Owner)
๊ฐ์ฒด ์๋ฐฉํฅ ๋งคํ์ ํ์ -> TEAM ์์ MEMBER ๋ฅผ ์ฐธ์กฐํ ๋ฐฉ๋ฒ์ด ์๋ค ->
์์ชฝ์์ ์ฐธ์กฐ๊ฐ๋ฅํ ๊ด๊ณ๋ฅผ ๋ง๋ค์ด์ค๋ค -> ์ฐธ์กฐ๊ฐ 2๊ฐ๊ฐ ๋์๋ค
---->
์ฌ๊ธฐ์ Member์ team ๊ฐ์ ๋ฐ๊ฟจ์ ๋ TEAM_ID(FK) ์ ๋ฐ์ดํธ ๋์ด์ผ ํ ์ง
Team์ members ๊ฐ์ ๋ฐ๊ฟจ์ ๋ TEAM_ID(FK)๊ฐ ์ ๋ฐ์ดํธ ๋์ด์ผ ํ ์ง ๋๋ ๋ง๊ฐ ์๊ธด๋ค
๋ ์ค ํ๋๋ก ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค .
์๋ฐฉํฅ ๋งคํ ๊ท์น
๊ฐ์ฒด์ ๋ ๊ด๊ณ์ค ํ๋๋ฅผ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ง์ ํด์ผ ํ๋ค .
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง์ด ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ,๋ฑ๋ก,์์ ํ ์ ์๋ค.
์ฃผ์ธ์ด ์๋์ชฝ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
์ฃผ์ธ์ mappedBy ์์ฑ์ ์ฌ์ฉX
์ฃผ์ธ์ด ์๋๋ฉด mappedBy ์์ฑ์ผ๋ก ์ฃผ์ธ์ ์ง์ ํ๋ค .
๋๊ตฌ๋ฅผ ์ฃผ์ธ์ผ๋ก ์ง์ ํด์ผ ํ ๊น?
์ธ๋ ํค๊ฐ ์๋ ๊ณณ์ ์ฃผ์ธ์ผ๋ก ์ ํด๋ผ !
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
์ธ๋ํค๊ฐ ์๋ ๊ณณ
Member.team ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ค
Member member = new Member();
member.setName("memberA");
member.setTeam(team);
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ ๋ ฅํด์ผ ํ๋ค
team.getMembers().add(member);
member.setTeam(team);
์๋ฐฉํฅ ๋งคํ์ ์์ ๊ฐ์ฒด ์ํ๋ฅผ ๊ณ ๋ คํด์ ํญ์ ์์ชฝ์ ๊ฐ์ ์ค์ ํ์
์๋ฐฉํฅ ๋งคํ ์ ๋ฆฌ
๋จ๋ฐฉํฅ ๋งคํ๋ง์ผ๋ก๋ ์ด๋ฏธ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ์๋ฃ๋ ๊ฒ์ด๋ค.
์๋ฐฉํฅ ๋งคํ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์กฐํ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๊ฒ ๋ฟ์ด๋ค .
๋จ๋ฑกํฅ ๋งคํ์ ์ํ๊ณ ์๋ฐฉํฅ์ ํ์ํ ๋ ์ถ๊ฐํด๋ ๋๋ค.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard