JPA CascadeType.ALL은 고아를 삭제하지 않습니다.


132

다음 매핑으로 JPA를 사용하여 고아 노드를 삭제하는 데 문제가 있습니다.

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

데이터베이스 주위에 고아 역할이 걸려 있습니다.

주석 org.hibernate.annotations.Cascade최대 절전 모드 특정 태그를 사용할 수 있지만 분명히 솔루션을 최대 절전 모드 구현에 묶고 싶지 않습니다.

편집 : JPA 2.0에 대한 지원이 포함될 것 같습니다.

답변:


164

Hibernate와 함께 사용하는 경우 CascadeType.DELETE_ORPHANJPA와 함께 사용할 수있는 주석을 명시 적으로 정의해야합니다 CascadeType.ALL.

최대 절전 모드를 사용하지 않으려면 먼저 하위 요소를 명시 적으로 삭제 한 다음 기본 레코드를 삭제하여 고아 레코드를 피해야합니다.

실행 순서

  1. 삭제할 메인 행을 가져옵니다.
  2. 자식 요소 가져 오기
  3. 모든 자식 요소를 삭제
  4. 메인 행 삭제
  5. 세션 종료

JPA 2.0에서는 orphanRemoval = true 옵션을 사용할 수 있습니다.

@OneToMany(mappedBy="foo", orphanRemoval=true)

3
덕분 에이 경로를 찾게되어 JPA 사양에 약간의 초과 사이트라고 생각합니다.
폴 웰런

13
JPA 2.0 표준에는 이제 @OneToMany의 속성으로 deleteOrphan이 있습니다. 최신 최대 절전 모드를 사용하는 경우 @OneToMany (..., deleteOrphan = true)를 수행 할 수 있습니다.
jomohke

자식 요소를 업데이트 할 때 실행 순서는 무엇입니까? 고아 기록이 삭제됩니까?
jAckOdE

113

JPA 2.0을 사용하는 경우 이제 주석 의 orphanRemoval=true속성을 사용하여 @xxxToMany고아를 제거 할 수 있습니다 .

실제로 CascadeType.DELETE_ORPHAN3.5.2-Final에서는 더 이상 사용되지 않습니다.


6
실제로 orphanRemoval = true는 다른 것을 의미한다고 생각합니다. 즉, 부모의 컬렉션에서 객체를 제거하면 객체가 삭제됩니다. 참조 download.oracle.com/javaee/6/tutorial/doc/bnbqa.html#giqxy
아치

Archie의 링크를 통해 문의하십시오.
Jigar Shah

4
orphanRemoval = true도 작동하지 않습니다. 그것은 옛날 방식으로 이루어져야합니다.
Joe Almore 2016 년

45
╔═════════════╦═════════════════════╦═════════════════════╗
   Action      orphanRemoval=true    CascadeType.ALL   
╠═════════════╬═════════════════════╬═════════════════════╣
   delete         deletes parent      deletes parent   
   parent         and orphans         and orphans      
╠═════════════╬═════════════════════╬═════════════════════╣
   change                                              
  children      deletes orphans         nothing        
    list                                               
╚═════════════╩═════════════════════╩═════════════════════╝

1
cascade = CascadeType.ALL, orphanRemoval = false부모 가 있고 삭제 하면 어떻게됩니까 ? 특별히 말하지 않더라도 어린이를 삭제합니까?
izogfif


7

@PrivateOwned를 사용하여 고아를 삭제할 수 있습니다. 예 :

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;

5
감사합니다 @reshma @PrivateOwned는 eclipselink JPA 확장입니다.
Paul Whelan

5

방금이 솔루션을 찾았지만 제 경우에는 작동하지 않습니다.

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = true 는 효과가 없습니다.


1
변경 사항이 적용되기 전에 청소하고 구축해야했습니다.
maralbjo

와우, ManyToOne에 CascadeType.ALL을 추가하는 것이 계단식 삭제가 아닌 이유에 대해 한 시간 동안 찾고있었습니다. 청소하고 건축했으며 작동합니다. 감사합니다 @maralbjo.
Andrew Mairose

4

Hibernate 를 사용한 Java Persistence 에 따르면 , 계단식 고아 삭제 는 JPA 주석으로 사용할 수 없습니다.

JPA XML에서도 지원되지 않습니다.


2

나는 같은 문제가 있었고 아래의 조건이 왜 고아를 삭제하지 않는지 궁금했습니다. 명명 된 삭제 쿼리를 실행할 때 최대 절전 모드 (5.0.3. 최종)에서 요리 목록이 삭제되지 않았습니다.

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

그런 다음 명명 된 삭제 쿼리를 사용하지 말고 EntityManager를 사용해야 한다는 것을 기억했습니다 . EntityManager.find(...)엔티티를 가져 와서 EntityManager.remove(...)삭제 하는 방법을 사용하면서 요리도 삭제되었습니다.


2

그냥 @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true).

targetEntity = MyClass.class를 제거 하면 훌륭하게 작동합니다.



0

일대일 매핑을 사용하고 있었지만 자식이 삭제되지 않았습니다. JPA가 외래 키 위반을주었습니다.

orphanRemoval = true 사용 후 문제가 해결되었습니다.


@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn (name = "CHILD_OID") 개인 자식 자식;
vipin chauhan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.