728x90
연관관계가 필요한 이유 : 협력 공동체를 만들 수 없다.
Member.class
- 현재 teamId 를 Long 타입으로 가지고 있다.
@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;
Team.class
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
객체를 테이블에 맞추어 모델링하면 외래 키 식별자를 직접 다루게 된다.
저장할때를 예를 들어보자.
team을 만들어서 teamA 로 이름을 설정하고, 영속화한다.
member 의 팀을 설정하려면, member에 team.getId() 를 통해 team id를 가져와서
설정하고 다시 영속화 해야한다.
검색할 때를 예를 들어보자
em.find 로 member의 id 를 통해 member를 찾는다.
찾은 멤버의 getTeamId() 를 통해 teamId 를 찾는다.
찾은 teamId 를 통해서 다시 find하여 Team을 찾는다.
아래와 같이 TeamId를 직접 다뤄야하는 불편함이 생긴다.
전혀 객체지향적이지 않으며, 협력관계를 가질 수 없다는 문제점이 있다.
// 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId());
em.persist(member);
// 검색
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
객체지향적으로 모델링 하려면??
단방향으로 설정해보자.
Member.class
- Member 와 Team의 관계는 N:1 이다.
( 여러 멤버들은 한개의 팀에 속한다 / 한개의 팀에는 여러 멤버들을 가질 수 있다 )
//@Column(name = "team_id")
//private Long teamId;
// 아래와같이변경
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
// 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team);
em.persist(member);
// 검색
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
728x90
'Spring > JPA' 카테고리의 다른 글
상속관계 매핑 ( @Inheritance , @DiscriminatorColumn ) (0) | 2022.09.23 |
---|---|
연관 관계 매핑 (1) | 2022.09.22 |
필드와 컬럼 매핑 (0) | 2022.09.20 |
데이터베이스 스키마 자동 생성 (0) | 2022.09.20 |
객체와 테이블 매핑 (0) | 2022.09.20 |
댓글