IT

JPA : 단방향 다 대일 및 계단식 삭제

lottoking 2020. 9. 16. 07:57
반응형

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 CASCADESQL 과 기능 기능 입니다.


JPA의 관계는 부모를 마이와 양방향으로 연결하지 않는 한 항상 단방향입니다. 부모에서 마이 구로의 계단식 REMOVE 작업에는 부모에서 마이너 관계가 필요합니다 (반대가 아닌).

따라서 다음을 수행해야합니다.

  • 단방향 @ManyToOne관계를 양방향 @ManyToOne또는 단방향 으로 변경하십시오 @OneToMany. 그런 다음 REMOVE 연산을 계단식으로 배열 하여 부모와 마이너스를 제거 할 수 있습니다 . 또한 사실로 지정 하여 부모 컬렉션의 자식 엔터티가 null이 설정된 경우 고아로 자식을 삭제할 수 있습니다 . 즉, 부모 컬렉션에없는 마이너스를 제거합니다.EntityManager.removeorphanRemoval
  • 또는 하위 테이블의 외래 키 제약 조건을 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

반응형