객체의 참조와 테이블의 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 클래스 설정 |
따라서 두 객체 필드 중 하나를 정해서 테이블의 외래키를 관리해야 한다.
이를 연관관계의 주인이라고 한다.
연관관계의 주인을 정하는 것은 외래 키 관리자를 선택하는 것이다.
연관관계의 주인은 외래 키의 위치와 관련해서 정해야한다.