2012-08-13 69 views
1

讓說我有下面的實體控制子實體

@Entity 
public class Item{ 

    private Country origin; 

    @ManyToOne(optional=true) 
    @JoinColumn(name="origin") 
    public Country getOrigin() { 
     return this.origin; 
    } 

} 

@Entity 
public class Country{ 

    private String code; 
    private String desc; 

    @Id 
    public String getCode() { 
     return this.code; 
    } 

    @Column 
    public String getDesc() { 
     return this.desc; 
    } 

} 

其中Country類映射到一個預設的主表,不應該被修改。 用戶可以在創建新的Item時設置origincode。 如何檢查提供的code是否已經是主表中的條目?

如果我只是persist()一個新的Item與不存在的code沒有堅持孩子,org.hibernate.TransientObjectException將被報告。我是否需要嘗試捕獲此異常以將其視爲不存在的主數據?或者有更好的選擇嗎?

在實際情況下,Item對象中有很多這些子實體,我認爲逐個明確查找主數據並不是一個好主意。我認爲這也不是一個好的解決方案。

回答

1

任何解決方案都需要查看主表以查看Country是否已經存在。這是你明確地進行這個調用的問題,還是你要求你的框架(Hibernate)爲你做這件事。

如果您知道創建Item的源/輸入不能被信賴,我會明確地驗證Country數據。如果你有一個你有嚴格控制權的GUI,那麼這個錯誤永遠不會發生,因爲你應該只給用戶有效的選項。另外,通過明確指出,如果您知道由於不可靠的數據而必須在持續存在之前進行檢查,則可以編寫單元測試以包含此顯式檢查。

請記住,Hibernate會將您的查詢緩存到國家/地區表,因此我不希望它會影響應用程序的性能。