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{
...
}
'BackEnd > Security · JPA' 카테고리의 다른 글
[ JPA ] Embedded - 재활용 가능한 Entity (0) | 2023.04.02 |
---|---|
[ JPA ] @Query ( 쿼리 커스텀 ) - Native Query (0) | 2023.03.31 |
[ JPA ] Transaction (0) | 2023.03.30 |
[ JPA ] 영속성 컨텍스트와 Entity 생애주기 (0) | 2023.03.29 |
[ JPA ] 연관관계 - ERD (0) | 2023.03.29 |