고아제거속성(Orphan Removal)/ 패스트캠퍼스 챌린지 21일차
Cadcade Delete 옵션 활용하기
remove option 살펴보기
BookRepository
void bookCascadeTest(){
Book book2 = bookRepository.findById(1L).get(); //지난번에 저장한 1L 가져오기
bookRepository.delete(book2);
System.out.println("books: "+bookRepository.findAll());
System.out.println("publishers: "+publisherRepository.findAll());
result
Book Entity는 삭제, Publisher Entity는 존재
books : []
publisher: [Publisher(super=BaseEntity(createdAt=2021-.........]
만약 Book과 함께 Publisher를 삭제하려면?
Case1.
BookRepository
void bookCascadeTest(){
Book book2 = bookRepository.findById(1L).get(); //지난번에 저장한 1L 가져오기
bookRepository.delete(book2);
+++++ publisherRepository.delete(boo2.getPublisher());
System.out.println("books: "+bookRepository.findAll());
System.out.println("publishers: "+publisherRepository.findAll());
Case2. Cascade활용
Book Entity
- Cascade delete옵션추가
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
@ToString.Exclude
private Publisher publisher;
dataSql에 데이터 입력 (실행시마다 자동으로 데이터 삽입)
BookRepository
@Test
void bookRemoveCascadeTest(){
bookRepository.findAll().forEach(book -> System.out.println(book.getPublisher()));
}
result
data.sql의 경우 단순하게 데이터만 입력하게 한다.
사전에 만든 listener같은건 작동하지 않아 createAt, updateAt이 작동하지 않게 되므로 null
Publisher(super=BaseEntity(createdAt=null, updateAt=null), id=1, name=패스트캠퍼스)
Publisher(super=BaseEntity(createdAt=null, updateAt=null), id=1, name=패스트캠퍼스)
BookRepository
: 삭제해보기
@Test
void bookRemoveCascadeTest(){
bookRepository.deleteById(1L); ++++++++
bookRepository.findAll().forEach(book -> System.out.println(book.getPublisher()));
}
result
publisher : null
book : id=1만 존재 (id=2 삭제)
JPA에서 OrphanRemoval 활용하기
cascade remove option 과의 차이점 알아보기
Orphan : 고아
즉, 연관관계가 없는 Entity를 제거하는 속성이다.
연관관계를 끊는 행위를 위해서는 setter를 통해 null을 주입하게 된다.
BookRepositoryTest
Book book3 = bookRepository.findById(1L).get();
book3.setPublisher(null);
bookRepository.save(book3);
System.out.println("book3-publisher : "+bookRepository.findById(1L).get().getPublisher());
result
book3-publisher : null
-> 이렇게 연관관계를 제거할 수 있다. 다만 이런경우에는 publisher 테이블 내에 기존 데이터는 그대로 남아 있게 된다.
이를 해결해주는게 OrphanRemoval 옵션.
Publisher
@OneToMany(orphanRemoval = true)
@JoinColumn(name="publisher_id")
@ToString.Exclude
private List<Book> books = new ArrayList<>();
public void addBook(Book book){
this.book.add(book);
}
}
#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는Java/Spring웹개발마스터초격차패키지Online
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
Author And Source
이 문제에 관하여(고아제거속성(Orphan Removal)/ 패스트캠퍼스 챌린지 21일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mangojuice/고아제거속성Orphan-Removal-패스트캠퍼스-챌린지-21일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)