2017-07-26 4 views
2

現在、データベースから親エントリを削除する場合は、親クラスのカスケードアノテーションを使用して、親を削除すると、それに。このように:JPA CRUDを使用して注釈を使用せずに親を明示的にカスケード接続する

@Entity 
public class Parent implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE) 
    private Set<Child> children; 
} 

@Entity 
public class Child implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @ManyToOne 
    @JoinColumn 
    private Parent parent; 
} 

実際の削除は次のように次のようになります。しかし

this.parentRepository.delete(parentID); 

、私はそれを行うだろうか、明示的に削除します。削除シンプルにカスケードするかどうかを選択したい場合は?

私は手動でコード内のカスケード注釈をオフにすることを選択できるとは思わないので、注釈を使用せずにカスケード削除する方法はありますか?

+0

[answer](https://stackoverflow.com/a/44338431)を確認してください。 – Cepr0

答えて

1

親が親に関係している場合は、親を削除しないでください。それは良い方法ではありません。あなたが持っているべきではない。このように

@EntityListeners({ParentJpaCallbacksListener.class}) 
@Entity 
public class Parent implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @OneToMany(mappedBy = "parent") 
    private Set<Child> children; 
} 

@Component 
public class ParentJpaCallbacksListener { 
    @Autoware ChildRepository childRepository; 

    @PreRemove 
    // or @PostRemove 
    void preRemove(Parent parent) { 
     // your cascade deletion logic 
     // for example use childRepository to delete some children 
    } 

} 

:デシベルの子で親

notNull制限を持っていますが、あなたが本当にカスケード削除を制御たくないはず、私が使用@EntityListenersをお勧めしますcascade = CascadeType.REMOVE

関連する問題