[JPA-5] 매핑-2

김아람·2024년 7월 17일
post-thumbnail

엔티티 매핑 소개

  • 객체와 테이블 매핑 : @Entity, @Table
  • 필드와 컬럼 매핑 : @Column
  • 기본 키 매핑 : @Id
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

📌 1. 연관관계 매핑 (양방향)

1) 테이블 연관관계 = 1개

  • 회원 ↔ 팀의 연관관계 1개 (양방향)
    → Member 테이블 입장에서 Team 테이블 조인 가능
    → Team 테이블 입장에서 Member 테이블 조인 가능

2) 객체 연관관계 = 2개

  • 회원 → 팀 연관관계 1개(단방향)
  • 팀 → 회원 연관관계 1개(단방향)
    → 사실은 단방향 연관관계가 2개 있는 것이다. 억지로 양방향이라고 말하는 것

양방향 연관관계를 맺었을 때 두 테이블 중 하나로 외래키를 관리해야 함.
→ 어떤 것을 관리할지 정해주는 것이 "연관관계 주인(Owner)"임.

"연관관계 주인(Owner)"

  • 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
  • 연관관계 주인만이 외래키를 관리(등록, 수정)
  • 주인이 아닌 쪽은 읽기만 가능(readonly)
  • 주인은 mappedBy 속성 사용X
    → 내가 누군가에게 의해서 mapping이 되었다라는 뜻
  • 주인이 아니면 mappedBy 속성으로 주인을 지정
  • mappedBy가 적힌 곳은 읽기만 가능하다. 값을 넣어봐야 아무일도 벌어지지X. 조회만 가능

Member.java

  @Entity
  @Getter @Setter
  public class Member {

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

      // 외래키 만들기
      @ManyToOne			
      @JoinColumn( name = "TEAM_ID" )
      @Setter(value = AccessLevel.NONE)			// lombok에서 자동 setter를 막는다
      private Team team;

      // 위에서 setter를 막아주었기 때문에 setter를 만들 수 있음
      public void setTeam(Team team) {
          this.team = team;
      }


  }

Team.java

  @Entity
  @Getter @Setter
  public class Team {

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

      @OneToMany(mappedBy = "team")			// mappedBy를 사용하여 연관관계 주인이 될 수 없음
      private List<Member> member = new ArrayList<>();

  }

JpaMain.java (기본 세팅 이후에 들어가는 부분임)

(세팅 생략)
	Team team = new Team();
		team.setName("TeamA");
		
		em.persist(team);
		
		Member member = new Member();
		member.setUsername("member1");
		member.setTeam(team);				// team 자체로 세팅
		em.persist(member);
		
		// 양방향 매핑(Member의 팀을 가져오는 동시에 멤버 목록을 가져옴)
		Member findSideMember = em.find(Member.class, member.getId());
		List<Member> members = findSideMember.getTeam().getMember();
		
		for( Member m : members ) {
			System.out.println("result = " + m.getUsername());
		}

0개의 댓글