JPA CascadeType.ALL은 고아를 삭제하지 않습니다.
다음 매핑으로 JPA를 사용하여 고아 노드를 삭제하는 데 문제가 있습니다.
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
데이터베이스 주위에 고아 역할이 걸려 있습니다.
주석 org.hibernate.annotations.Cascade
최대 절전 모드 특정 태그를 사용할 수 있지만 분명히 솔루션을 최대 절전 모드 구현에 묶고 싶지 않습니다.
편집 : JPA 2.0에 대한 지원이 포함될 것 같습니다.
Hibernate와 함께 사용하는 경우 CascadeType.DELETE_ORPHAN
JPA와 함께 사용할 수있는 주석을 명시 적으로 정의해야합니다 CascadeType.ALL
.
최대 절전 모드를 사용하지 않으려면 먼저 하위 요소를 명시 적으로 삭제 한 다음 기본 레코드를 삭제하여 고아 레코드를 피해야합니다.
실행 순서
- 삭제할 메인 행을 가져옵니다.
- 자식 요소 가져 오기
- 모든 자식 요소를 삭제
- 메인 행 삭제
- 세션 종료
JPA 2.0에서는 orphanRemoval = true 옵션을 사용할 수 있습니다.
@OneToMany(mappedBy="foo", orphanRemoval=true)
JPA 2.0을 사용하는 경우 이제 주석 의 orphanRemoval=true
속성을 사용하여 @xxxToMany
고아를 제거 할 수 있습니다 .
실제로 CascadeType.DELETE_ORPHAN
3.5.2-Final에서는 더 이상 사용되지 않습니다.
╔═════════════╦═════════════════════╦═════════════════════╗
║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ delete ║ deletes parent ║ deletes parent ║
║ parent ║ and orphans ║ and orphans ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ change ║ ║ ║
║ children ║ deletes orphans ║ nothing ║
║ list ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝
EclipseLink와 함께 JPA를 사용하는 경우 @PrivateOwned 어노테이션 을 설정해야합니다 .
문서 : Eclipse Wiki-EclipseLink JPA 확장 사용-1.4 장 @PrivateOwned 주석을 사용하는 방법
@PrivateOwned를 사용하여 고아를 삭제할 수 있습니다. 예 :
@OneToMany(mappedBy = "masterData", cascade = {
CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
Java Persistence with Hibernate 에 따르면 , 계단식 고아 삭제 는 JPA 주석으로 사용할 수 없습니다.
JPA XML에서도 지원되지 않습니다.
방금이 솔루션을 찾았지만 제 경우에는 작동하지 않습니다.
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = true 는 효과가 없습니다.
나는 같은 문제가 있었고 아래의 조건이 왜 고아를 삭제하지 않는지 궁금했습니다. 명명 된 삭제 쿼리를 실행할 때 식기 목록이 최대 절전 모드 (5.0.3. 최종)에서 삭제되지 않았습니다.
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();
그런 다음 명명 된 삭제 쿼리를 사용하지 말고 EntityManager를 사용해야 한다는 것을 기억했습니다 . EntityManager.find(...)
엔티티를 가져 와서 EntityManager.remove(...)
삭제 하는 방법을 사용하면서 요리도 삭제되었습니다.
그냥 @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
.
targetEntity = MyClass.class를 제거 하면 훌륭하게 작동합니다.
레코드의 경우 JPA2 이전의 OpenJPA에서는 @ElementDependant였습니다.
일대일 매핑을 사용하고 있었지만 자식이 삭제되지 않았습니다. JPA가 외래 키 위반을주었습니다.
orphanRemoval = true 사용 후 문제가 해결되었습니다.
참고URL : https://stackoverflow.com/questions/306144/jpa-cascadetype-all-does-not-delete-orphans
'Programming' 카테고리의 다른 글
자식이 Gtk 경고를 생성합니다 : 디스플레이를 열 수 없습니다 (0) | 2020.06.30 |
---|---|
두 개의 목록을 반복하는 더 좋은 방법이 있습니까? 각 반복마다 각 목록에서 하나의 요소를 얻습니까? (0) | 2020.06.30 |
푸시 또는 구성 변경없이 Heroku 슬러그를 다시 컴파일 (0) | 2020.06.30 |
열의 형식 문자열을 사용하여 수레의 팬더 DataFrame을 표시하는 방법은 무엇입니까? (0) | 2020.06.30 |
UIStackView의 배경색을 변경하는 방법은 무엇입니까? (0) | 2020.06.30 |