캐스케이드 타입의 차이점은 무엇입니까?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
'source' 카테고리의 다른 글
| 여러 조인된 테이블에서 where 구에 사용자 지정 열을 사용합니다. (0) | 2022.11.12 |
|---|---|
| React에서 자녀의 상태에 액세스하는 방법 (0) | 2022.11.12 |
| Python이 해석되면 .pyc 파일이 뭐죠? (0) | 2022.11.12 |
| jQuery와 비동기적으로 파일을 업로드하려면 어떻게 해야 합니까? (0) | 2022.11.12 |
| 마리아에서 테이블 2개를 완전히 연결하다DB (0) | 2022.11.12 |