2009-09-04 75 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手段,那麼不僅從當前實體撇清,但將其刪除。

舉一個例子,考慮兩個實體:房子和房間。

刪除樓客房名單意味着,如果你刪除衆議院然後刪除所有它的客房。如果您從該集合房間,將其全部刪除

DELETE_ORPHAN上府會議室列表上表示。沒有它,房間將仍然存在,但不附加任何東西(因此「孤兒」)。

在UML和OO建模而言,這基本上是組合物和聚合之間的差異。房子 - >房間關係是構圖的一個例子。房間是衆議院的一部分,並不是獨立存在的。

聚集的一個例子是,比如類(父級)學生(孩子)。刪除班級和學生仍然存在(無疑在其他班級)。從班級中刪除學生通常不意味着刪除他或她。

+5

FYI:如果你的接口,Hibernate是JPA ** **,你能夠做到這與在'@ OneToMany'註解'orphanRemoval = TRUE;屬性自** JPA 2.0 **。請參閱http://stackoverflow.com/a/2928481/1029261 – rmoestl 2013-11-07 08:13:15