- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private Long teamId;
}
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
create table Member (
id bigint generated by default as identity,
teamId bigint,
username varchar(255),
primary key (id)
)
create table Team (
id bigint generated by default as identity,
name varchar(255),
primary key (id)
)
참조가 아닌 외래키 값을 그대로 가지고 있다.
final Team team = Team.of("TeamA");
em.persist(team);
final Member member = Member.of("member1", team.getId());
em.persist(member);
//조회
final Member findMember = em.find(Member.class, member.getId());
// 연관 관계가 없음
final Team findTeam = em.find(Team.class, findMember.getTeamId());
Hibernate:
/* insert hellojpa.domain.team.Team
*/ insert
into
Team
(id, name)
values
(null, ?)
Hibernate:
/* insert hellojpa.domain.member.Member
*/ insert
into
Member
(id, teamId, username)
values
(null, ?, ?)
Member와 Team이 연관관계가 맺어져 있지 않기 때문에 Member에서 해당하는 Team을 찾을 때 참조를 할 수 없어 Member.getTeamId()를 이용해 DB에 조회해야 한다는 번거로움이 있다.
- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다.
- 테이블과 객체 사이에는 이러한 큰 간격이 있다.