JPA OneToMany가 하위 항목을 삭제하지 않음
심플한 것에 문제가 있습니다.@OneToMany
상위 엔티티와 하위 엔티티 간의 매핑.모두 정상 작동하지만 컬렉션에서 제거해도 해당 하위 레코드만 삭제되지 않습니다.
부모:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
자녀:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
이제 하위 세트에서 및 하위 항목을 삭제해도 데이터베이스에서 삭제되지 않습니다.무효화하려고 했습니다.child.parent
하지만 그것도 효과가 없었습니다.
엔티티는 웹 응용 프로그램에서 사용되며 삭제는 Ajax 요청의 일부로 수행됩니다.저장 버튼을 눌렀을 때 삭제된 아이 목록이 없으므로 암묵적으로 삭제할 수 없습니다.
JPA의 동작은 정확합니다(사양에 따라). 단순히 OneToMany 컬렉션에서 개체를 제거했다고 해서 개체가 삭제되는 것은 아닙니다.벤더 고유의 확장이 있습니다만, 네이티브 JPA에서는 대응하고 있지 않습니다.
부분적으로 이것은 JPA가 컬렉션에서 삭제된 무언가를 삭제해야 하는지 여부를 실제로 알지 못하기 때문입니다.오브젝트 모델링의 경우, 이것이 구성과 "집약"의 차이입니다.
구성상, 하위 엔티티는 상위 엔티티 없이 존재하지 않는다.전형적인 예는 집과 방 사이이다.의회를 삭제하면 회의실도 삭제됩니다.
집계는 더 느슨한 종류의 연관성으로 과정과 학생으로 대표됩니다.과정을 삭제해도 학생은 여전히 존재합니다(다른 과정에 있을 수 있음).
따라서 벤더별 확장을 사용하여 이 동작을 강제하거나(사용 가능한 경우), 명시적으로 하위 항목을 삭제하고 상위 컬렉션에서 제거해야 합니다.
알고 있습니다.
- 휴지 상태: 캐스케이드 delete_orphan.10.11을 참조해 주세요. 과도적 지속성
- Eclipse Link: 이것을 「프라이빗 오너십」이라고 부릅니다.@PrivateOwned 주석 사용 방법을 참조하십시오.
2010년 12월 이후 최종판인 JPA 2.0은 Cletus의 답변과 더불어orphanRemoval
탓으로 돌리다@OneToMany
주석입니다.자세한 내용은 이 블로그 항목을 참조하십시오.
이 사양은 비교적 새로운 것이기 때문에 모든 JPA 1 프로바이더가 최종 JPA 2를 실장하고 있는 것은 아닙니다.예를 들어 Hibernate 3.5.0-Beta-2 릴리스에서는 아직 이 Atribute를 지원하지 않습니다.
다음과 같이 시험해 보십시오.
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
.
설명한 바와 같이 JPA에서는 원하는 작업을 수행할 수 없기 때문에 hibernate.cascade 주석을 사용했습니다.이것에 의해, 부모 클래스의 관련 코드는 다음과 같습니다.
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "parent")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE,
org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.PERSIST,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<Child> childs = new HashSet<Child>();
ALL을 사용하면 부모도 삭제되기 때문에 간단하게 사용할 수 없습니다.
@Entity
class Employee {
@OneToOne(orphanRemoval=true)
private Address address;
}
여기 보세요.
여기서 cascade는 remove의 컨텍스트에서 부모를 삭제하면 자녀가 삭제됨을 의미합니다.협회가 아닙니다.휴지 상태를 JPA 공급자로 사용하는 경우 휴지 상태별 캐스케이드를 사용하여 실행할 수 있습니다.
다음과 같이 시험해 보십시오.
@OneToOne(cascade = CascadeType.REFRESH)
또는
@OneToMany(cascade = CascadeType.REFRESH)
언급URL : https://stackoverflow.com/questions/2011519/jpa-onetomany-not-deleting-child
'programing' 카테고리의 다른 글
여러 v-for 루프...다른 방법은 없을까? (0) | 2022.08.10 |
---|---|
'vue'에서 'createApp' 내보내기를 찾을 수 없습니다. (0) | 2022.08.10 |
Java로 정렬된 컬렉션 (0) | 2022.08.10 |
C, C++에서 Windows 또는 Linux 검출 (0) | 2022.08.10 |
Java 8의 map() 메서드와 platMap() 메서드의 차이점은 무엇입니까? (0) | 2022.08.10 |