회원과 팀은 다대일관계를 가진다.!
이때, 객체를 관계형 DB에 맞춰 모델링해보자
객체지향스럽지 않게 엔티티에 외래키 필드(teamId)를 만든다.
이렇게 하면, 객체에서 조회했을 때 member랑 team의 연관관계가 없다.
Member 엔티티
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "TEAM_ID")
private Long teamId; // 관계형DB에 맞춘 방식
}
Team 엔티티
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
}
회원저장
Member member = new Member();
member.setTeamId(team.getId());
member의 Team을 지정할때 member.setTeam()
이 아닌 member.setTeamId
즉 외래키 식별자를 직접 다룬다.
객체가 아닌 외래키 식별자를 직접 다룬다.
객체지향적인 방법이 아니다!
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
=> 패러다임의 차이
객체 지향적으로 모델링을 하면 Member는 Team 참조값을 갖게 된다.
Member 엔티티
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
// 하나의 팀에 여러 멤버가 소속될 수 있다.
// Member =>many, Team => one
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
Team 엔티티
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
연관관계 수정
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
//회원1에 새로운 팀B 설정
member.setTeam(teamB);
연관 관계를 수정할 때는 값만 바꿔주면 자동으로 update 쿼리가 나간다.
참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.