@ManyToOne JPA 연관에 대한 CascadeType.ALL의 의미는 무엇입니까


210

나는 @ManyToOne관계 의 맥락에서 계단식의 의미를 잘못 이해했다고 생각 합니다.

경우:

public class User {

   @OneToMany(fetch = FetchType.EAGER)
   protected Set<Address> userAddresses;

}

public class Address {

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   protected User addressOwner;

}

의 의미는 무엇입니까 cascade = CascadeType.ALL? 예를 들어 데이터베이스에서 특정 주소를 삭제하면 cascade = CascadeType.ALL데이터를 추가했다는 사실이 내 데이터에 어떻게 영향을 미칩니 User까?

답변:


360

의미는 CascadeType.ALL지속성이 모든 EntityManager작업 ( PERSIST, REMOVE, REFRESH, MERGE, DETACH)을 관련 엔터티에 전파 (연쇄)한다는 것 입니다.

Address를 제거하면 관련을 제거 할 수 있으므로 귀하의 경우에는 나쁜 생각 인 것 같습니다 User. 사용자가 여러 주소를 가질 수 있으므로 다른 주소는 고아가됩니다. 그러나 반대의 경우 (주석 달기 User)는 의미가 있습니다. 주소가 단일 사용자에게만 속하는 경우이 사용자가 삭제 된 경우 사용자에게 속한 모든 주소의 제거를 전파하는 것이 안전합니다.

BTW : 조인 열이 ADDRESS 테이블에 있어야한다는 것을 지속성 공급자에게 알리기 위해 mappedBy="addressOwner"특성을 속성 에 추가 할 수 있습니다 User.


55
map1에 대한 가장 좋고 짧은 설명은 +1입니다.
Ridcully

4
@OneToMany 측에 CascadeType.ALL이 있으면 좋을 수 있습니다.
mvmn

48

OpenJPA 문서의 예제는 여기참조하십시오 . CascadeType.ALL모든 작업을 수행한다는 의미입니다.

인용문:

CascadeType.PERSIST : 엔터티를 유지할 때 해당 필드에있는 엔터티도 유지합니다. EntityManager가 플러시 중 새 엔티티를 참조하는 필드를 발견하고 해당 필드가 CascadeType.PERSIST를 사용하지 않으면 오류이므로이 계단식 규칙의 자유 적용을 제안합니다.

CascadeType.REMOVE : 엔티티를 삭제할 때이 필드에 보유 된 엔티티도 삭제합니다.

CascadeType.REFRESH : 엔터티를 새로 고칠 때이 필드에있는 엔터티도 새로 고칩니다.

CascadeType.MERGE : 엔티티 상태를 병합 할 때이 필드에 보유 된 엔티티도 병합하십시오.

세바스찬


4
JPA에 새로 도입 된이 정보는 유용하지만 여기서 분리하는 것은 어떻습니까?
Sarz

1
CascadeType.DETACH에서 엔티티를 분리 할 때 상위 엔티티가 보유한 엔티티도 분리합니다.
Dorian Mejer 2016 년

29

내가 설명한 바와 같이 이 문서 내 책에 고성능 자바 지속성 , 당신은 사용하지 말아야 CascadeType.ALL@ManyToOne있기 때문에 엔티티 상태 전환 자식들 다른 방법은 주위에 부모 개체에서 전파해야한다.

@ManyToOne는 기본 외래 키 열을 매핑하기 때문에 측면은 항상 자식 협회입니다.

따라서 이동해야 CascadeType.ALL으로부터 @ManyToOne받는 협회 @OneToMany도 사용한다면, mappedBy그 이후의 속성을 가장 효율적인 일대 테이블 관계 매핑 .


18

EJB3.0 사양에서 :

계단식 어노테이션 요소의 사용은 연관된 엔티티에 조작의 효과를 전파하는 데 사용될 수 있습니다. 계단식 기능은 가장 일반적으로 부모-자식 관계에서 사용됩니다.

X가 관리 대상 엔티티 인 경우 제거 조작으로 인해 해당 엔티티가 제거됩니다. X에서 이러한 다른 엔티티와의 관계에 cascade = REMOVE 또는 cascade = ALL 주석 요소 값으로 주석이 지정된 경우 제거 조작은 X가 참조하는 엔티티로 캐스케이드됩니다.

간단히 말해서, 정의 된 엔터티 관계 CascadeType.All는 부모에서 발생하는 지속, 새로 고침, 병합 및 제거와 같은 모든 지속성 이벤트가 자식에게 전달되도록합니다. 다른 CascadeType옵션을 정의 하면 개발자가 엔티티 연관이 지속성을 처리하는 방법을보다 세밀하게 제어 할 수 있습니다.

예를 들어 페이지 목록이 포함 된 Book이라는 개체가 있고이 목록 내에 페이지 개체를 추가 한 경우입니다. @OneToMany장부와 페이지 간의 연관을 정의 하는 주석이로 표시 CascadeType.All되면 장부를 유지하면 페이지도 데이터베이스에 유지됩니다.


11

JPA 2.0에서는 사용자 엔티티에서 주소를 제거한 경우 주소를 삭제하려는 경우에 orphanRemoval=true대신 (를 CascadeType.REMOVE) 추가 할 수 있습니다 @OneToMany.

orphanRemoval=true와 사이에 자세한 설명 CascadeType.REMOVE있습니다 .


4

사용자에게 할당 된 주소를 삭제하고 사용자 엔터티 클래스에 영향을 미치지 않으려면 다음과 같이 시도하십시오.

@Entity
public class User {
   @OneToMany(mappedBy = "addressOwner", cascade = CascadeType.ALL)
   protected Set<Address> userAddresses = new HashSet<>();
}

@Entity 
public class Addresses {
   @ManyToOne(cascade = CascadeType.REFRESH) @JoinColumn(name = "user_id")
   protected User addressOwner;
}

이런 식으로 주석에서 인출 사용에 대해 걱정할 필요가 없습니다. 그러나 사용자를 삭제할 때 사용자 개체에 연결된 주소도 삭제됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.