나는 @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
까?
답변
의미는 CascadeType.ALL
지속성이 모든 EntityManager
작업 ( PERSIST, REMOVE, REFRESH, MERGE, DETACH
)을 관련 엔터티에 전파 (연쇄)한다는 것 입니다.
Address
를 제거하면 관련을 제거 할 수 있으므로 귀하의 경우에는 나쁜 생각 인 것 같습니다 User
. 사용자가 여러 주소를 가질 수 있으므로 다른 주소는 고아가됩니다. 그러나 반대의 경우 (주석 달기 User
)는 의미가 있습니다. 주소가 단일 사용자에게만 속하는 경우이 사용자가 삭제 된 경우 사용자에게 속한 모든 주소의 제거를 전파하는 것이 안전합니다.
BTW : 조인 열이 ADDRESS 테이블에 있어야한다는 것을 지속성 공급자에게 알리기 위해 mappedBy="addressOwner"
특성을 속성 에 추가 할 수 있습니다 User
.
답변
OpenJPA 문서의 예제는 여기 를 참조하십시오 . CascadeType.ALL
모든 작업을 수행한다는 의미입니다.
인용문:
CascadeType.PERSIST : 엔터티를 유지할 때 해당 필드에있는 엔터티도 유지합니다. EntityManager가 플러시 중 새 엔티티를 참조하는 필드를 발견하고 해당 필드가 CascadeType.PERSIST를 사용하지 않으면 오류이므로이 계단식 규칙의 자유 적용을 제안합니다.
CascadeType.REMOVE : 엔티티를 삭제할 때이 필드에 보유 된 엔티티도 삭제합니다.
CascadeType.REFRESH : 엔터티를 새로 고칠 때이 필드에있는 엔터티도 새로 고칩니다.
CascadeType.MERGE : 엔티티 상태를 병합 할 때이 필드에 보유 된 엔티티도 병합하십시오.
세바스찬
답변
내가 설명한 바와 같이 이 문서 내 책에 고성능 자바 지속성 , 당신은 사용하지 말아야 CascadeType.ALL
에 @ManyToOne
있기 때문에 엔티티 상태 전환 자식들 다른 방법은 주위에 부모 개체에서 전파해야한다.
@ManyToOne
는 기본 외래 키 열을 매핑하기 때문에 측면은 항상 자식 협회입니다.
따라서 이동해야 CascadeType.ALL
으로부터 @ManyToOne
받는 협회 @OneToMany
도 사용한다면, mappedBy
그 이후의 속성을 가장 효율적인 일대 테이블 관계 매핑 .
답변
계단식 어노테이션 요소의 사용은 연관된 엔티티에 조작의 효과를 전파하는 데 사용될 수 있습니다. 계단식 기능은 가장 일반적으로 부모-자식 관계에서 사용됩니다.
X가 관리 대상 엔티티 인 경우 제거 조작으로 인해 해당 엔티티가 제거됩니다. X에서 이러한 다른 엔티티와의 관계에 cascade = REMOVE 또는 cascade = ALL 주석 요소 값으로 주석이 지정된 경우 제거 조작은 X가 참조하는 엔티티로 캐스케이드됩니다.
간단히 말해서, 정의 된 엔터티 관계 CascadeType.All
는 부모에서 발생하는 지속, 새로 고침, 병합 및 제거와 같은 모든 지속성 이벤트가 자식에게 전달되도록합니다. 다른 CascadeType
옵션을 정의 하면 개발자가 엔티티 연관이 지속성을 처리하는 방법을보다 세밀하게 제어 할 수 있습니다.
예를 들어 페이지 목록이 포함 된 Book이라는 개체가 있고이 목록 내에 페이지 개체를 추가 한 경우입니다. @OneToMany
장부와 페이지 간의 연관을 정의 하는 주석이로 표시 CascadeType.All
되면 장부를 유지하면 페이지도 데이터베이스에 유지됩니다.
답변
JPA 2.0에서는 사용자 엔티티에서 주소를 제거한 경우 주소를 삭제하려는 경우에 orphanRemoval=true
대신 (를 CascadeType.REMOVE
) 추가 할 수 있습니다 @OneToMany
.
orphanRemoval=true
와 사이에 자세한 설명 CascadeType.REMOVE
이 있습니다 .
답변
사용자에게 할당 된 주소를 삭제하고 사용자 엔터티 클래스에 영향을 미치지 않으려면 다음과 같이 시도하십시오.
@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;
}
이런 식으로 주석에서 인출 사용에 대해 걱정할 필요가 없습니다. 그러나 사용자를 삭제할 때 사용자 개체에 연결된 주소도 삭제됩니다.