dev/JPA 기본
단방향 연관관계
dev_0hoon
2024. 2. 1. 10:12

해당 테이블 같을 때에 멤버가 팀에 소속되긱에 멤버(N) : 팀(1)의 관계가 된다.
객체관계에서는 TEAM_ID를 가지고 있는 것은 객체지향스럽지 않다고 한다. TEAM 객체 자체를 가지고 있어야한다.
TABLE 관점에서는 TEAM_ID를 가지고 있는 것이 맞다.
MEMBER 객체 안에 TEAM_ID가 아닌 TEAM 자체를 넣어준다.
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
MEMBER가 N이기 떄문에 @MantToOne 관계라는 것을 어노테이션해준 뒤 DB에게 알려줄 JoinColumn을 알려준다.
이건 내가 team을 찾기 위해 필요했던 FK를 생각하면 된다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team); //team을 set한다.
em.persist(member);
em.flush();
em.clear();
Member findMember = em.find(Member.class, member.getId());
Team team1 = findMember.getTeam();
System.out.println("findTeam = " + team1);
member를 저장할 때에 team을 넣을 수 있게 된다. db에서는 자연스럽게 TEAM_ID만 저장 시키는 구조가 된다.

Hibernate:
/* insert jpabook.jpashop.domain.Team
*/ insert
into
Team
(name, TEAM_ID)
values
(?, ?)
Hibernate:
/* insert jpabook.jpashop.domain.Member
*/ insert
into
Member
(TEAM_ID, USERNAME, MEMBER_ID)
values
(?, ?, ?)
Hibernate:
select
member0_.MEMBER_ID as MEMBER_I1_1_0_,
member0_.TEAM_ID as TEAM_ID3_1_0_,
member0_.USERNAME as USERNAME2_1_0_,
team1_.TEAM_ID as TEAM_ID1_4_1_,
team1_.name as name2_4_1_
from
Member member0_
left outer join
Team team1_
on member0_.TEAM_ID=team1_.TEAM_ID
where
member0_.MEMBER_ID=?
로그 내역
변경 때도 똑같다.
findMember.setTeam(newTeam);
변경감지로 자동 업데이트 된다.