고아제거속성(Orphan Removal)/ 패스트캠퍼스 챌린지 21일차

망고쥬스·2021년 11월 21일
0

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

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3FVdhDa

profile
#newbieDeveloper #since 2021.04.06

0개의 댓글