😈 참고로 ManyToMany는 잘 안쓰고 중간에 맵핑 엔티티(테이블)을 만들어서 사용한다. BookAndAuthor라고 만들꺼지만 네이밍은 원래 이렇게 하면 안된다.
Author Entity
@Entity
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Author extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String country;
// @ManyToMany
@OneToMany
@JoinColumn(name = "author_id")
@ToString.Exclude
private List<BookAndAuthor> bookAndAuthors = new ArrayList<>();
public void addBookAndAuthors(BookAndAuthor... bookAndAuthors) {
Collections.addAll(this.bookAndAuthors, bookAndAuthors);
}
}
Book Entity
...
...
@OneToMany
@JoinColumn(name = "book_id")
@ToString.Exclude
private List<BookAndAuthor> bookAndAuthors = new ArrayList<>();
public void addBookAndAuthors(BookAndAuthor... bookAndAuthors) {
Collections.addAll(this.bookAndAuthors, bookAndAuthors);
}
...
...
BookAndAuthor Entity
@Entity
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BookAndAuthor extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Book book;
@ManyToOne
private Author author;
}
TEST 해보자
@Test
@Transactional
void manyToManyTest() {
Book book1 = givenBook("책1");
Book book2 = givenBook("책2");
Book book3 = givenBook("개발책1");
Book book4 = givenBook("개발책2");
Author author1 = givenAuthor("martin");
Author author2 = givenAuthor("steve");
BookAndAuthor bookAndAuthor1 = givenBookAndAuthor(book1, author1);
BookAndAuthor bookAndAuthor2 = givenBookAndAuthor(book2, author2);
// 공동 저자
BookAndAuthor bookAndAuthor3 = givenBookAndAuthor(book3, author1);
BookAndAuthor bookAndAuthor4 = givenBookAndAuthor(book3, author2);
// 공동 저자
BookAndAuthor bookAndAuthor5 = givenBookAndAuthor(book4, author1);
BookAndAuthor bookAndAuthor6 = givenBookAndAuthor(book4, author2);
// book1.addAuthor(author1);
// book2.addAuthor(author2);
// book3.addAuthor(author1, author2);
// book4.addAuthor(author1, author2);
//
// author1.addBook(book1, book3, book4);
// author2.addBook(book2, book3, book4);
book1.addBookAndAuthors(bookAndAuthor1);
book2.addBookAndAuthors(bookAndAuthor2);
book3.addBookAndAuthors(bookAndAuthor3, bookAndAuthor4);
book4.addBookAndAuthors(bookAndAuthor5, bookAndAuthor6);
author1.addBookAndAuthors(bookAndAuthor1, bookAndAuthor3, bookAndAuthor5);
author2.addBookAndAuthors(bookAndAuthor2, bookAndAuthor4, bookAndAuthor6);
bookRepository.saveAll(Lists.newArrayList(book1, book2, book3, book4));
authorRepository.saveAll(Lists.newArrayList(author1, author2));
// System.out.println("authors through book : " + bookRepository.findAll().get(2).getAuthors());
// System.out.println("books through author : " + authorRepository.findAll().get(0).getBooks());
bookRepository.findAll().get(2).getBookAndAuthors().forEach(o -> System.out.println(o.getAuthor()));
authorRepository.findAll().get(0).getBookAndAuthors().forEach(o -> System.out.println(o.getBook()));
}
연관관계는 여기서 끝이다. JPA 연관관계 많이 복잡할수 있지만, 잘 활용하면 정말 좋을꺼같다. 빨리 실전에 써보고 싶다.