반응형
관계에는 1:1 , 1:N , N:N 관계가 있고, JPA에서는 이의 연관관계를 나타내는 방법이 있다.
@OneToOne
private Class class; --> 이렇게만 설정하면 서로에 서로에대한 FK가 생기고 , 그렇기때문에 mapped by option을 통해서 지정을 해줘야한다.
mapped by: 다른 클래스의 변수명을 입력해주면된다. , 연관 키를 해당테이블에서는 가지지 않게되는 효과를 받을 수 있다.
@OneToMany -> 1:N중에 1인 클래스에 선언
private List<class> class = new ArrayList<>(); -> 초기화 시켜주는 습관
@JoinColum(name = " ") -> 어떤 colum과 join할지 지정하는 어너테이션
@OneToMany + @JoinColumn:
@ManyToOne + @JoinColumn + mappedBy:
Book에서 @OneToMany + @JoinColumn 사용:
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
@OneToMany
@JoinColumn(name = "book_id") // 외래 키 컬럼 이름
private List<Review> reviews = new ArrayList<>();
// Getter, Setter, 등등...
}
@Entity
public class Review {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Book book; // "다" 쪽 엔티티 참조
// Getter, Setter, 등등...
}
Book에서 @OneToMany + mappedBy 사용:
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "book") // "다" 쪽 엔티티의 필드명
private List<Review> reviews = new ArrayList<>();
// Getter, Setter, 등등...
}
@Entity
public class Review {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "book_id") // 외래 키 컬럼 이름
private Book book; // "다" 쪽 엔티티 참조
// Getter, Setter, 등등...
}
두 가지 방식이 있길래 serching 해보니 모두 "일" 쪽(Book)에서 @OneToMany를 사용하고, "다" 쪽(Review)에서 @ManyToOne을 사용하는 것은 맞습니다. 주요 차이점은 어느 쪽에서 외래 키를 관리하느냐에 있습니다
- 첫 번째 방식 (@JoinColumn):
- Book 엔티티에서 @OneToMany에 @JoinColumn을 사용하여 외래 키 관리를 합니다.
- Review 엔티티에서는 @ManyToOne을 사용하여 book 필드를 통해 해당 책을 참조합니다.
- 데이터베이스에는 book_id라는 컬럼이 Review 테이블에 생성됩니다.
- 두 번째 방식 (@MappedBy):
- Book 엔티티에서 @OneToMany(mappedBy = "book")를 사용하여 연관 관계 주인이 아님을 표시합니다.
- Review 엔티티에서 @ManyToOne에 @JoinColumn을 사용하여 외래 키 관리를 합니다.
- 데이터베이스에는 book_id라는 컬럼이 Review 테이블에 생성됩니다.
결국 두 방식 모두 Review 엔티티에는 book_id라는 외래 키 컬럼이 생성되며, 이 컬럼을 통해 Review 엔티티와 Book 엔티티가 연결됩니다.
@ManyToMany???
one이 없다면 외래키로 정할 것이 없다.
연관 테이블을 하나 더 만들어서 OneToMany ManyToOne으로 만드는 것을 추천~~
반응형
'Spring > JPA' 카테고리의 다른 글
태태개발일지 - JPA Auditing (2) | 2024.10.22 |
---|---|
태태개발일지(EVENT) (1) | 2023.12.04 |
태태개발일지(query method) (0) | 2023.08.21 |
태태개발일지(JPA트러블 슈팅) (0) | 2023.08.16 |
태태개발일지(JPA) (0) | 2023.08.10 |