엔티티 매핑 소개
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
1) 테이블 연관관계 = 1개
2) 객체 연관관계 = 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());
}