source

캐스케이드 타입의 차이점은 무엇입니까?JPA에서 REMOVE 및 orphanRemoval?

bestscript 2022. 11. 12. 08:25

캐스케이드 타입의 차이점은 무엇입니까?JPA에서 REMOVE 및 orphanRemoval?

와의 차이는 무엇입니까?

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

그리고.

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

이 예는 Java EE Tutorial에서 가져온 것이지만 자세한 내용은 아직 모르겠습니다.

여기서부터:-

계단식 제거

참조 필드를 CascadeType으로 마킹합니다.REMOVE(또는 CascadeType).ALL(REMOVE 포함)은 삭제 작업이 해당 필드에서 참조되는 엔티티 개체에 자동으로 캐스케이드되어야 함을 나타냅니다(여러 엔티티 개체를 수집 필드에서 참조할 수 있습니다).

@Entity
class Employee {
     :
    @OneToOne(cascade=CascadeType.REMOVE)
    private Address address;
     :
}

고아 제거

JPA 2는 @OneToOne 및 @OneToMany 주석의 orphanRemoval 요소를 사용하여 지정할 수 있는 추가적이고 적극적인 제거 캐스케이드 모드를 지원합니다.

@Entity
class Employee {
     :
    @OneToOne(orphanRemoval=true)
    private Address address;
     :
}

차이점:-

두 설정 간의 차이는 연결 해제에 대한 응답에 있습니다.예를 들어 주소 필드를 늘 또는 다른 주소 개체로 설정하는 경우 등입니다.

  • orphanRemoval=true를 지정하면 연결 해제된 주소 인스턴스가 자동으로 제거됩니다.소유자 개체(예: 직원)의 참조 없이는 존재하지 않아야 하는 종속 개체(예: 주소)를 정리할 때 유용합니다.
  • 캐스케이드=캐스케이드 타입의 경우.REMOVE가 지정되었습니다.관계해제가삭제가아닌경우자동작업은실행되지않습니다.
    작동.

다른 점을 쉽게 이해할 수 있는 방법CascadeType.REMOVE그리고.orphanRemoval=true.

고아 제거의 경우:호출하는 경우setOrders(null), 관련 정보Order엔티티가 자동으로 DB에서 제거됩니다.

캐스케이드 제거의 경우:호출하는 경우setOrders(null), 관련 정보Order엔티티는 db에서 자동으로 삭제되지 않습니다.

하위 엔티티와 상위 엔티티가 있다고 가정합니다.부모는 여러 아이를 가질 수 있다.

@Entity
class parent {
  //id and other fields
 @OneToMany (orphanRemoval = "true",cascade = CascadeType.REMOVE)
   Set<Person> myChildern;
}

orphan Removal은 ORM 개념으로 자녀가 고아인지 여부를 나타냅니다.데이터베이스에서도 삭제해야 합니다.

자녀는 부모로부터 접근할 수 없는 경우 고아가 됩니다.예를 들어, 사용자 객체 세트를 제거하거나(빈 세트로 설정) 새 세트로 바꾸면, 부모는 더 이상 이전 세트의 하위 세트에 액세스할 수 없고 하위 개체는 고립되므로 하위 개체도 데이터베이스에서 제거됩니다.

캐스케이드 타입REMOVE는 데이터베이스 수준의 개념으로, 상위 항목이 제거되면 하위 테이블의 관련 레코드를 모두 제거해야 함을 나타냅니다.

캐스케이드 타입제거한다.

CascadeType.REMOVE다음과 같이 명시적으로 설정할 수 있습니다.

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();

으로 CascadeType.ALL★★★★

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();

를 사용하면 할 수 있습니다.remove★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

그 so so so so so so so so so so so so so soPost와 엔티티comments" " " 를 삭제합니다.post★★★★★★★★★★★★★★★★★★:

Post post = entityManager.createQuery("""
    select p
    from Post p
    join fetch p.comments
    where p.id = :id
    """, Post.class)
.setParameter("id", postId)
.getSingleResult();

entityManager.remove(post);

휴지 상태에서는 다음 3개의 delete 스테이트먼트가 실행됩니다.

DELETE FROM post_comment 
WHERE id = 2

DELETE FROM post_comment 
WHERE id = 3

DELETE FROM post 
WHERE id = 1

PostComment되었습니다.CascadeType.REMOVE마치 하위 엔티티도 제거하는 것처럼 행동한 전략입니다.

고아 제거 전략

strategy(고아 전략.orphanRemoval★★★★

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL,
    orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();

를 사용하면 컬렉션에서 하위 엔티티를 제거할 때 하위 테이블 행을 제거할 수 있습니다.

「 」를하면, 「 」를 로드됩니다.Post와 엔티티comments 후 첫 합니다.PostComment comments★★★★

Post post = entityManager.createQuery("""
    select p
    from Post p
    join fetch p.comments c
    where p.id = :id
    order by p.id, c.id
    """, Post.class)
.setParameter("id", postId)
.getSingleResult();

post.remove(post.getComments().get(0));

합니다.post_comment[ ] :

DELETE FROM post_comment 
WHERE id = 2

실질적으로 차이는 데이터 업데이트(PATCH)를 시도하는지(PUT)에 있습니다.

를 들어, 지우다, 지우다를 칩시다.customercascade=REMOVE이 된다고 되는 경우가 있습니다.이 주문은 의도적이고 편리하다고 생각됩니다.

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

이제 여러분이 해 보겠습니다.customerorphanRemoval="true"이전 주문은 모두 삭제되고 제공된 주문으로 교체됩니다.(PUT면측으로 REST API)

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

orphanRemoval사용하다PATCH면측으로 REST API)

언급URL : https://stackoverflow.com/questions/18813341/what-is-the-difference-between-cascadetype-remove-and-orphanremoval-in-jpa