오늘의 공부는 백기선님의 @OneToMany 양방향 관계 쿼리 문제입니다.
원본 영상은 아래 링크를 참조해주세요~
@Entity
@Getter @Setter
public class Book {
@Id @GeneratedValue
private Integer id;
private String isbn;
private String Title;
@ManyToOne
private BookStore bookstore;
}
@Entity
@Getter @Setter
public class BookStore {
@Id @GeneratedValue
private Integer id;
private String name;
@OneToMany(mappedBy="bookStore")
private Set<Book> books = new HashSet<>();
void add(Book book) {
this.books.add(book);
}
}
@Test
public void contextLoads() {
BookStore bookStore = new BookStore();
bookstore.setName("시애틀 책방");
bookStoreRepository.save(bookStore);
Book book = new Book();
book.setTitle("JAP 공부 좀 하면서 쓰세요");
bookStore.add(book);
bookRepository.save(book);
}
Q . 왜 책 테이블에 연관관계가 설정되지 않았는가?
양방향 관계의 기본 문제이다. 테이블과 객체는 본질적으로 다르다.
테이블은 foreign key 가 어디 있던지 각 테이블에서 join 에서 조회할 수 있지만, 객체는 알 수 없다.
그래서 양방향 관계 설정 시 연관관계의 주인이 누구인지(FK 키를 누가 가지고 있는지) 알려주어야 한다.
mappedBy 속성으로 상대편 테이블이 주인이라는 것을 알려준다.
관계의 주인인 쪽에서 관계가 설정이 되어야 한다. 그래야 데이터베이스에 제대로 반영이 된다.
그래서 public void add(Book book) 메서드 내에 book.setBookStore(this); 를 삽입하면 문제 해결이 된다.
반대 코드인 getBooks().add(book) 도 객체 지향적인 관점에서 보았을 때 당연히 해주어야 한다.
데이터베이스에 적용할 때는 아무런 작용이 되지 않지만 객체에서도 값을 적용해주어야 하기 때문에 당연히 해야 한다.
'JAVA > JPA' 카테고리의 다른 글
[JPA][백기선] @ManyToOne 단방향 관계 쿼리 문제 (0) | 2022.04.09 |
---|