객체의 참조와 테이블의 FK를 매핑하는 것이 목표


class Member {
private Long id;
private String name;
private Team team;
}
class Team {
private Long id;
private String name;
private List<Member> memberList;
}
member.getTeam()
team.getMemberList()

SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
객체 참조와 테이블 외래 키 매핑

@Entity
@Table(name = "MEMBER")
@Getter
@Setter
@NoArgsConstructor
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
@Table(name = "TEAM_TABLE")
@Getter
@Setter
@NoArgsConstructor
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
@JoinColumn| 속성 | 기능 | 기본값 |
|---|---|---|
| name | 매핑할 외래 키 이름 | {필드명}_{참조하는 테이블의 기본키 컬럼명} |
| referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본키 컬럼명 |
| foriegnKey (DDL) | 외래키 제약조건 | |
| unique | @Column의 속성과 동일 | |
| nullable | @Column의 속성과 동일 | |
| insertable | @Column의 속성과 동일 | |
| updatable | @Column의 속성과 동일 | |
| columnDefinition | @Column의 속성과 동일 | |
| table | @Column의 속성과 동일 |
@ManyToOne| 속성 | 기능 | 기본값 |
|---|---|---|
| optional | false로 설정하면 연관된 엔티티가 항상 있어야 한다. | true |
| fetch | 글로벌 fetch 전략 설정 | @ManyToOne=FetchType.EAGER @OneToMany=FetchType.LAZY |
| cascade | 영속성 전이 기능 설정 | |
| 연관된 Entity 클래스 설정 |
따라서 두 객체 필드 중 하나를 정해서 테이블의 외래키를 관리해야 한다.
이를 연관관계의 주인이라고 한다.

연관관계의 주인을 정하는 것은 외래 키 관리자를 선택하는 것이다.
연관관계의 주인은 외래 키의 위치와 관련해서 정해야한다.