JPA : 단방향 다 대일 및 계단식 삭제
다음과 같은 단방향 @ManyToOne
관계 가 존재 가정 합니다.
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
}
@Entity
public class Child implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumn
private Parent parent;
}
나는 부모 P와 자녀가있는 경우 C 1 ... C N P 다시 참조, 자동으로 아이를 제거하는 JPA에서 깨끗하고 예쁜 방법이 C 1 ... C N P가 제거 될 때 (즉 entityManager.remove(P)
)?
내가 찾고있는 것은 ON DELETE CASCADE
SQL 과 기능 기능 입니다.
JPA의 관계는 부모를 마이와 양방향으로 연결하지 않는 한 항상 단방향입니다. 부모에서 마이 구로의 계단식 REMOVE 작업에는 부모에서 마이너 관계가 필요합니다 (반대가 아닌).
따라서 다음을 수행해야합니다.
- 단방향
@ManyToOne
관계를 양방향@ManyToOne
또는 단방향 으로 변경하십시오@OneToMany
. 그런 다음 REMOVE 연산을 계단식으로 배열 하여 부모와 마이너스를 제거 할 수 있습니다 . 또한 사실로 지정 하여 부모 컬렉션의 자식 엔터티가 null이 설정된 경우 고아로 자식을 삭제할 수 있습니다 . 즉, 부모 컬렉션에없는 마이너스를 제거합니다.EntityManager.remove
orphanRemoval
- 또는 하위 테이블의 외래 키 제약 조건을
ON DELETE CASCADE
. 지속성 게임을 새로 고쳐야 호출 후 호출 해야합니다. 하위 대규모 데이터베이스에서 삭제 된 후 지속성 경쟁에 존재하지 않습니다.EntityManager.clear()
EntityManager.remove(parent)
최대 대체 모드를 JPA 공급자로 사용하는 경우 @OnDelete 주석을 사용할 수 있습니다. 이 주석은 데이터베이스에 삭제를 삭제 ON DELETE CASCADE 트리거를 관계에 추가 합니다.
예 :
public class Parent {
@Id
private long id;
}
public class Child {
@Id
private long id;
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private Parent parent;
}
이 솔루션을 사용하면 마이에서 부모로의 단방향 관계만으로도 모든 마이 구 자동으로 제거 할 수 있습니다. 이 솔루션에는 리스너 등이 필요하지 않습니다. 또한 DELETE FROM Parent WHERE id = 1 과 같은 쿼리 는 마이너스를 제거합니다.
다음과 같이 양방향 관계를 만듭니다.
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private Set<Child> children;
}
@ManytoOne에서 @ManytoOne에서 삭제가 예상대로 작동하지 않습니다. 부모가 삭제하면 이상적으로 사라져도하지만 부모 만 삭제되고 삭제되지 않고 고아로 남아 있습니다.
사용하는 기술은 Spring Boot / SpringData JPA / Hibernate입니다.
스프린트 부팅 : 2.1.2.RELEASE
SpringData JPA / Hibernate는 행을 삭제하는 데 사용됩니다.
parentRepository.delete(parent)
ParentRepository는 아래와 같이 표준 CRUD 저장소를 확장합니다. ParentRepository extends CrudRepository<T, ID>
다음은 내 엔티티 클래스입니다.
@Entity(name = “child”)
public class Child {
@Id
@GeneratedValue
private long id;
@ManyToOne( fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = “parent_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private Parent parent;
}
@Entity(name = “parent”)
public class Parent {
@Id
@GeneratedValue
private long id;
@Column(nullable = false, length = 50)
private String firstName;
}
이 방법을 사용하여 한 면만 삭제하십시오.
@ManyToOne(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY)
// @JoinColumn(name = "qid")
@JoinColumn(name = "qid", referencedColumnName = "qid", foreignKey = @ForeignKey(name = "qid"), nullable = false)
// @JsonIgnore
@JsonBackReference
private QueueGroup queueGroup;
@Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
주어진 주석이 나를 위해 일했습니다. 시도해 볼 수 있습니다
예를 들어 :-
public class Parent{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="cct_id")
private Integer cct_id;
@OneToMany(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER,mappedBy="clinicalCareTeam", orphanRemoval=true)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<Child> childs;
}
public class Child{
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="cct_id")
private Parent parent;
}
참고 URL : https://stackoverflow.com/questions/7197181/jpa-unidirectional-many-to-one-and-cascading-delete
'IT' 카테고리의 다른 글
레이아웃을 확장하여 사용자 지정보기를 만드시겠습니까? (0) | 2020.09.16 |
---|---|
자바 영역을 GMT / UTC로 강제 적용 (0) | 2020.09.16 |
for 루프보다 System.arraycopy (…)를 사용하는 것이 더 낫 오류입니까? (0) | 2020.09.16 |
AngularJS ui-router 상태 시스템에서 뒤로 버튼을 사용하여 뒤로 버튼을 사용합니까? (0) | 2020.09.16 |
PostgreSQL- 열에 대한 Max 값이있는 행 가져 오기 (0) | 2020.09.16 |