2009-09-04 12 views
22

は、ソースコードである:DELETE_ORPHANとDELETEの違いは何ですか?ここ

@OneToOne(fetch = FetchType.LAZY) 
@Cascade({SAVE_UPDATE, EVICT, DELETE}) 
@JoinColumn(name = "A_ID", nullable = true) 
private A a; 

@OneToMany 
@Cascade({SAVE_UPDATE, EVICT, DELETE, DELETE_ORPHAN}) 
@JoinColumn(name = "B_ID") 
private List<B> bList; 

DELETE_ORPHANとDELETEの違いは何ですか?

答えて

54

カスケードDELETEは、このエンティティが削除された場合、関連するエンティティを削除することを意味します。

DELETE_ORPHANは、エンティティが関連する一対多コレクションから削除された場合、現在のエンティティとの関連付けを解除するだけでなく削除することを意味します。

たとえば、HouseとRoomという2つのエンティティを考えてみましょう。

家の部屋リストの削除は、家を削除するとその部屋をすべて削除することを意味します。

ハウスの客室リストのDELETE_ORPHANは、そのコレクションからルームを削除した場合、それを完全に削除することを意味します。それがなければ、部屋はまだ存在しますが、何にも結び付けられません(したがって「孤児」)。

UMLおよびOOモデリング用語では、これは基本的に構成と集計の違いです。 House-> Room関係は構成の一例です。部屋は家の一部であり、独立して存在しません。

集計の例は、クラス(親)から生徒(子)までです。クラスを削除しても、学生はまだ存在しています(間違いなく他のクラスにあります)。クラスから学生を削除することは、通常、彼または彼女を削除することを意味しません。

+5

FYI:Hibernateへのインターフェイスが** JPA **の場合、** JPA 2.0 **以来、 '@ OneToMany'アノテーションの中の' orphanRemoval = true'属性でそれを達成することができます。 http://stackoverflow.com/a/2928481/1029261を参照してください。 – rmoestl

関連する問題