@Test
void bookCascadeTest() {
// 영속성 전이 테스트
// 책 생성 후 저장
Book book = new Book();
book.setName("JPA 초격차 패키지");
bookRepository.save(book);
// 출판사 생성
Publisher publisher =new Publisher();
publisher.setName("우리집");
publisherRepository.save(publisher);
// 책의 출판사를 set
book.setPublisher(publisher);
bookRepository.save(book);
// 출판사의 책을 set
// callByValue callByRef
// publisher는 List이기 때문에 하나의 책(객체)를 불러와서 book으로 넣는다.
// publisher.getBooks().add(book);
publisher.addBook(book); // 위에 코드 보다 조금더 가독성있다.
// 하지만 setter를 사용하여 직관적으로 표현하는게 더 좋다.
// 이런경우에는 Publisher클래스에 addBook()함수를 하나 만드는 것도 좋은 방법이다.
publisherRepository.save(publisher);
System.out.println("book : " + bookRepository.findAll());
System.out.println("publishers : " + publisherRepository.findAll());
}
could not initialize proxy - no Session
@OneToMany // 1 : N \ Book : Review
@JoinColumn(name = "book_id") //중간 테이블 방지
@ToString.Exclude // 릴레이션은 단방향으로 걸고 ToString은 제외해야한다.
private List<Review> reviews = new ArrayList<>();
publisherRepository.save(publisher);
bookRepository.save(book);
@Test
void bookCascadeTest() {
Book book = new Book();
book.setName("JPA 초격차 학습");
Publisher publisher =new Publisher();
publisher.setName("우리집");
book.setPublisher(publisher);
bookRepository.save(book);
// publisher.addBook(book); Cascade(영속성전이)할 것 이기 때문에 따로 publisher에 set 하지 않아도 된다.
System.out.println("book : " + bookRepository.findAll());
System.out.println("publishers : " + publisherRepository.findAll());
}
object references an unsaved transient instance - save the transient instance before flushing : com.practice.jpa.bookmanager.domain.Book.publisher -> com.practice.jpa.bookmanager.domain.Publisher
@ManyToOne(cascade = CascadeType.PERSIST)
@ToString.Exclude
private Publisher publisher;
Hibernate:
insert
into
publisher
(created_at, updated_at, name)
values
(?, ?, ?)
Hibernate:
insert
into
book
(created_at, updated_at, author_id, category, name, publisher_id)
values
(?, ?, ?, ?, ?, ?)
Book book1 = bookRepository.findById(1L).get();
book1.getPublisher().setName("바뀐집");
bookRepository.save(book1);
System.out.println("publishers : "+publisherRepository.findAll());
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@ToString.Exclude
private Publisher publisher;