연관관계 맵핑2(양방향 연관관계, 연관관계의 주인)

Mina Park·2022년 8월 30일
0

1. 양방향 연관관계 맵핑

  • DB 테이블: 외래키 하나로 양방향 조회가 가능한 양방향 관계
  • 객체: 회원-팀(N:1), 팀-회원(1:N)
public class MemberMapping {

    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private TeamMapping team;

	//...getter, setter
}
public class TeamMapping {

    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;

    private String name;

    @OneToMany(mappedBy = "team")
    private List<MemberMapping> members = new ArrayList<>();
    
    //...getter, setter
}
	//조회
    MemberMapping findMember = em.find(MemberMapping.class, member.getId());
    List<MemberMapping> members = findMember.getTeam().getMembers(); //객체 그래프 탐색: 팀 -> 멤버


2. 연관관계의 주인

1) 개념

  • 객체 & 테이블 연관관계
    • 객체 연관관계: 회원 => 팀(단방향) & 팀 => 회원(단방향)
    • 테이블 연관관계: 회원 <=> 팀(양방향)
  • 사실상 객체의 경우 2개의 단방향 연관관계가 묶여서 양방향으로 보이는 것

그렇다면, 객체의 참조는 2개인데 외래키는 둘 중 무엇으로 관리해야할까?
📌 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리하기 위해 필요한 것이 "연관관계의 주인"
📌연관관계의 주인을 정한다 = 외래키 관리자를 선택한다

2) 매핑 규칙

  • 테이블에 외래키가 있는 곳이 주인!!!
  • 연관관계의 주인(owner)만 데이터베이스의 연관관계와 맵핑 & 외래키 관리(등록, 수정, 삭제)
  • 주인이 아닌 반대편(inverse)은 읽기만 가능, mappedBy 속성으로 연관관계의 주인값을 지정
	//팀 저장
 	TeamMapping team = new TeamMapping();
    team.setName("teamA");
    em.persist(team);

	//멤버1 저장
    MemberMapping member1 = new MemberMapping();
    member1.setUsername("member1");
    member1.setTeam(team); //연관관계 설정: member1 -> team 
    em.persist(member1);
    
    //멤버2 저장
    MemberMapping member2 = new MemberMapping();
    member2.setUsername("member2");
    member2.setTeam(team); //연관관계 설정: member2 -> team 
    em.persist(member2);
   

0개의 댓글