2011-09-17 66 views
1

以我java web app(使用playframework),我有一個Customer具有Address這樣映射JPA映射以除去孤實體

@Entity 
class Customer extends Model{ 
    @ManyToOne 
    Address address; 
... 
} 

@Entity 
class Address extends Model{ 
    String addressline1; 
    ... 
} 

我有一個setCustomerAddress(..)方法這需要用戶輸入,R etrieves從db中匹配地址或創建一個新地址,然後如果客戶地址爲空或不同,則設置輸入地址。

public static void setCustomerAddress(...){ 
    Customer = Customer.findById(custId); 
    Address address = findOrCreateAddress(addressline1,...); 
    if ((customer.getAddress()==null) || (!customer.getAddress().equals(address))) { 
    customer.setAddress(address); 
    customer.save(); 
} 
... 
} 

customer1創建Address1。 customer2輸入相同的Address1。

現在都有Address1;

id | addressline1 | addressline2 | country 
----+--------------+--------------+--------- 
25 |apple st.  |    | US 


id |name   |address_id 
----+--------------+------------ 
1 |jim   |25 
2 |roy   |25 

如果customer2表增加了一個addressline2,地址被認爲是不同的,所以一個新的地址是建立

地址表

id | addressline1 | addressline2 | country 
----+--------------+--------------+--------- 
25 |apple st.  |    | US 
26 |apple st.  |richman's end | US 

客戶表

id |name   |address_id 
----+--------------+------------ 
1 |jim   |25 
2 |roy   |26 

假設,customer1表通過添加與customer2相同的addressline2來更新他的地址,現在他的address_id p oints到的customer2 客戶表

id |name   |address_id 
----+--------------+------------ 
1 |jim   |26 
2 |roy   |26 

這留下一個地址記錄(25)的地址不屬於任何客戶。

這應該留在db?還是應該刪除?正確的做法是什麼?ManyToOne不允許任何orphanRemoval我猜。我必須在代碼中清除它,可能會做一些檢查這樣的孤獨實體?

任何指針將受到歡迎

+0

Cascade =「all-delete-orphan」你在找什麼? http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html – lexicore

+0

這是可能的多對一?我只能找到CascadeType.ALL – jimgardener

回答

1

孤兒去除可在JPA 2.0做只爲@OneToOne@OneToMany註解關係。

@ManyToOne的情況下,孤兒刪除不是一個有效的術語,因爲當您試圖刪除「父母」時,如果沒有子實體存在。與未刪除的子實體相比,這是一種完全不同的情況,因爲它沒有父母(即它已經成爲孤兒)。

如果您認爲Address記錄必須在數據庫中,當沒有Customer存在記錄被刪除,您必須編寫代碼來刪除Address實體,在沒有Customer實體引用它。我沒有意識到其他代碼,但是這看起來像是一個SQL(本機)或JPQL查詢的工作,用於獲取所有這樣的文件。

請注意,由於之前陳述的原因,在這種情況下,不可能在JPA 2.0中使用孤立刪除功能。因此,在Address實體(orphanRemoval屬性設置爲true)中與@OneToMany帶註釋的屬性創建雙向關係不會導致刪除未引用的Address記錄。但是,您可以創建雙向關係以避免使用SQL或JPQL查詢(因爲您可以計算Address的集合屬性中的Customer的數量)。