문제

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

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

데이터베이스 주변에 고아 역할 문제가 발생하고 있습니다.

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

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

도움이 되었습니까?

해결책

최대 절전 모드와 함께 사용하는 경우 주석을 명시 적으로 정의해야합니다. CascadeType.DELETE_ORPHAN, JPA와 함께 사용할 수 있습니다 CascadeType.ALL.

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

실행 순서

  1. 메인 행을 삭제할 메인 행을 가져옵니다
  2. 어린이 요소를 가져 오십시오
  3. 모든 어린이 요소를 삭제합니다
  4. 메인 행 삭제
  5. 닫기 세션

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를 사용하는 경우 @privateown 주석.

선적 서류 비치: Eclipse Wiki -Eclipselink 사용 JPA 확장 - 1.4 장 1.4 @privateowned 주석 사용 방법

@privateowned를 사용하여 고아를 삭제할 수 있습니다

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

에 따르면 최대 절전 모드와의 자바 지속성, 캐스케이드 고아 삭제 JPA 주석으로 사용할 수 없습니다.

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

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

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

orphanremoval = true 효과가 없습니다.

나는 같은 문제가 있었고 아래 의이 조건이 왜 고아를 삭제하지 않았는지 궁금했습니다. 이름이 지정된 삭제 쿼리를 실행했을 때 요리 목록은 최대 절전 모드 (5.0.3.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에서 @ElementDependent였습니다.

나는 한 번의지도를 사용하고 있었지만 어린이는 삭제되지 않았다. JPA는 외국의 주요 위반을 주었다.

orphanremoval = true를 사용한 후 문제가 해결되었습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top