Member Entity
@Entity
public class Member {
@Id @GeneratedValue
@Column(name="member_id")
private Long id;
private String name;
@Column(name = "team_id")
private Long teamId;
}
Team Entity
@Entity
public class Team {
@Id @GeneratedValue
@Column(name="team_id")
private Long id;
private String name;
}
각자의 table에 맞게만 객체가 생성된 상태이지 별다른 연관관계는 보이지 않습니다!
이렇게 별도의 연관관계 매핑 없이 만들어진 Entity는 외래키를 가지고 있는 쪽에서 외래키를 직접 다뤄줘야 합니다.
ex)
// 팀 먼저 저장
Team team=new Team();
...
em.persist(team);
//회원 저장
Member member-new Member();
...
member.setTeamId(team.getId()); //외래 키를 직접 다룸
em.persist(member);
외래키를 가지고 있는 쪽 Member객체에서 Team의 객체를 참조하는 것이 아닌 team_id만을 갖고 있기 때문에 엔티티 매니저로 따로 따로 조회를 할 수 밖에 없습니다.
즉, 객체를 DB 테이블에만 맞추어 모델링하면 협력 관계를 만들 수 없다는 뜻이 됩니다.
위 처럼 외래 키를 가지고 있는 객체에서 키를 아닌 객체를 직접 참조하게 만들어 봅시다!
Member Entity
@Entity
public class Member {
@Id @GeneratedValue
@Column(name="member_id")
private Long id;
private String name;
/* @Column(name = "team_id")
private Long teamId; */
@ManyToOne
@JoinColumn(name="team_id")
private Team team; //객체를 직접 참조
}
Meber Entity의 코드만 이런 식으로 수정하게 되면 단방향 연관관계가 성립되게 됩니다!
ex) 저장
// 팀 먼저 저장
Team team=new Team();
...
em.persist(team);
//회원 저장
Member member-new Member();
...
member.setTeam(team); //객체를 저장
em.persist(member);
외래 키를 가지고 있는 쪽에서 객체를 직접 참조하고 있기 때문에 엔티티 매니저로 Member만 조회하게 되면 member.getTeam()과 같은 코드로 따로 조회할 필요 없이 참조를 사용해서 조회를 할 수 있게 됩니다.
단방향 연관관계에서는 Member Entity에서만 Team Entity를 참조하였습니다.
양방향 연관관계에서는 Member와 Team이 N:1관계 이므로 Member Entity에서는 Team객체 하나만 참조하면 됐지만, Team 객체에서는 연관된 Member들을 모두 참조하고 있어야 합니다. 즉, Member객체를 List형태로 여러개 참조합니다.
Team Entity
@Entity
public class Team {
@Id @GeneratedValue
@Column(name="team_id")
private Long id;
private String name;
@OneToMany(mappedBy="team")
private List<Member> members- new ArrayList<Member>()
}
Team Entity의 코드만 이런 식으로 수정하면 됩니다.
외래키의 주인을 N쪽에 넣는 이유는 생각해보면 간단합니다. 위 처럼 Member와 Team의 관계에서 만약 1쪽인 Team에 외래 키가 있다고 생각하여 봅시다. 그럼 DB 테이블에 저장될 때 Team 테이블에서 외래 키인 Member_id만 다른 중복된 인스턴스들이 생기게 될 것입니다..
그리하여 외래 키의 주인은 N쪽 객체로 설정하여야 합니다!!
이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic