Spring/JPA

태태개발일지(연관관계 JPA)

태태코 2023. 8. 17. 12:08
반응형

관계에는 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을 사용하는 것은 맞습니다. 주요 차이점은 어느 쪽에서 외래 키를 관리하느냐에 있습니다

  1. 첫 번째 방식 (@JoinColumn):
    • Book 엔티티에서 @OneToMany에 @JoinColumn을 사용하여 외래 키 관리를 합니다.
    • Review 엔티티에서는 @ManyToOne을 사용하여 book 필드를 통해 해당 책을 참조합니다.
    • 데이터베이스에는 book_id라는 컬럼이 Review 테이블에 생성됩니다.
  2. 두 번째 방식 (@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