minlog
article thumbnail

 

Cascade

영속성 전의 

 

OneToOne, OnToMany, ManyToOne, ManyToMany 등의 연관관계에서 Cascade (*enum) 타입들을 설정할 수 있다.

( * enum : 어떤 값을 사용할수 있는지 예시를 볼수 있다.)

 

@OneToOne, @OnToMany, @ManyToOne, @ManyToMany 

cascade = CascadeType.속성
defalut 기본값은 아무런 전의가 없는 것이다.
PERSIST 생성시만 적용 .
객체가 생성될 때 연관관계에 있는 객체도 함께 생성.
MERGE  업데이트시 연관관계가 있는 객체도 함께 수정.
REMOVE ⭐ 삭제 시 연관관계가 있는 하위 객체도 함께 삭제된다.
(많이 사용하지만 주의해야하는 속성 - 고아제속성 제거와 함께 확인)
REFRESH 재 로딩시 연관관계도 함께 재 로딩이 일어난다.
DETACH 영속성을 관리하지 않겠다고 분리하는 속성
ALL 모든 영속성을 전의 시키겠다는 속성

 

 

📑 Book.java

@ManyToOne(cascade = CascadeType.PERSIST)
@ToString.Exclude
private Publisher publisher;

📑 테스트 코드 

@Test
void bookCascadeTest(){
    Book book = new Book();
    book.setName("jpa 초격차 패키지");

    Perblisher perblisher = new Perblisher();
    perblisher.setName("확인");

    book.setPublisher(perblisher); // 연관관계 
    bookRepositiory.save(book); //book 저장 --- 영속화, perblisher도 생성이된다.
}

- @ManyToOne(cascade = CascadeType.PERSIST) : 생성시 적용

- @ManyToOne(cascade = { CascadeType.PERSIST , CascadeType.MERGE }) : 생성, 업데이트 시 적용

 

 

 

 


 

고아제속성 제거 

연관관계가 없는 Entity를 제거 하는 속성

 

 

1) 연관관계 제거

setter를 통해서 연관관계가 있는 값에 null을 주입한다.

 

2) 연관관계 상위에 속성 추가

cascade = CascadeType.REMOVE

📑 Book.java

@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
@ToString.Exclude
private Publisher publisher;

 

3) 연관관계 포함되는 필드의 속성에  orphanRemoval 속성 추가

📑 publisher.java

@OneToMany(orphanRemoval = false)
@JoinColumn(name="publisher_id")
@ToString.Eclude
private List<Book> books = new ArrayList<>();
orphanRemoval = 속성
false 연관관계가 전혀 없는 데이터를 제거하지 않는다.
true 필요가 없어진 고아객체를 제거한다.

 

 


 

💡데이터 삭제에 대한 실무 소개 

일반적으로 delete 쿼리를 사용하여 실제 데이터를 삭제하는 경우가 거이 없다.

( ex: 회원탈퇴 제외 )

 

🍫두가지 방법!

1. 테이블 속성 추가를 활용한 삭제기능

- 속성을 활용해 지웠다고 표시할 수 있게, 필드 추가

기본 false , 해당 속성이 true 이면 제거 

📑 Book.java

private boolean deleted;

 

- 쿼리 메서드 생성 jpaRepository 

📑 bookRepository

public interface BookRepository extends JpaRepository <Book, Long>{
	List<Book> findAllByDeletedFalse();
    //또는 
    List<Book> findByCategoryIsNullAndDeletedFalse();
}

 

- 메서드 실행

📑 테스트 코드

bookRepository.findAllByDeletedFalse().forEach(System.out::println);
bookRepository.findByCategoryIsNullAndDeletedFalse().forEach(System.out::println);

 

 

2. 어노테이션을 활용한 삭제 기능 

 

- 조건절 추가 

해당 조건절은 조회 시 항상 추가가 되어 조회된다. 

 

@Where(clause="조건설정") => @Where(clause="deleted = false")

 

📑 Book.java

@Entity
@NoArgsConsructor
@Data
@ToString(callSuper=true)
@EqulsAndHashCode(callSuper = true)
@Where(clause="deleted = false")
public class Book extends BaseEntity{
	...
}

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!