연관관계를 매핑할 떄 고려해야하는 3가지 사항
- 다중성
- 단방향, 양방향
- 연관관계의 주인
다중성의 종류
- 다대일: @ManyToOne
- 일대다: @OneToMany
- 일대일: @OneToOne
- 다대다: @ManyToMany
@OneToMany
외래키를 매핑하는 방법
@JoinColumn
| 속성 | 기능 | 기본 값 |
| name | 매핑할 외래 키 이름 | "필드명" + "_" 을 참조하는 테이블의 기본 키 컬럼 명 |
| referencedColumnName | 외래키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본 키 컬럼 명 |
| foreignKey(DDL) | 외래 키 제약조건을 직접 지정 테이블을 생성할 때만 사용 |
|
| unique | @Column의 속성과 같음 | |
| nullable | @Column의 속성과 같음 | |
| insertable | @Column의 속성과 같음 | |
| updateable | @Column의 속성과 같음 | |
| columnDefinition | @Column의 속성과 같음 | |
| table | @Column의 속성과 같음 |
@OneToMany 단방향
@ManyToOne과 비슷한 구조이다.
class Member{
//연관관계 주인 클래스, One
@Id
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@OneToMany
@JoinColumn(name="TEAM_ID")
private Team team; //Team 객체와 연관관계를 맺음
}
class Team{
//Many
@Id
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
@OneToMany 양방향
이런 매핑은 공식적으로 존재 하지 않는다!
@JoinColumn(name = "team_id", insertable = false, updatable = false)
코드를 사용한다.
@ManyToOne과 @JoinColumn을 사용해서 연관관계를 매핑하면, 다대일 단반향 매칭이 되어버리는데
반대쪽 Team에서 이미 일대다 단방향 매핑이 설정되어 있어 두 테이블 모두 FK를 관리하게 된다.
그걸 방지하기 위해 insertable과 updateable을 false로 설정해준다.
그외에도 읽기 전용으로 사용이 가능하다
하지만 다대일 양방향을 사용하는 편이 낫다!
'Spring' 카테고리의 다른 글
| [Spring Security] 패스워드 암호화(PasswordEncoder) (0) | 2023.04.17 |
|---|---|
| [Spring JPA] 다양한 연관관계 매핑(@OneToOne, @ManyToMany) (0) | 2023.04.16 |
| [Spring JPA] 다양한 연관관계 매핑(@ManyToOne) (0) | 2023.04.10 |
| [Spring JPA] 단방향, 양방향 연관관계 (0) | 2023.04.09 |
| [Spring JPA] 엔티티 설계 (0) | 2023.04.08 |