2012-08-23 38 views
0

我不確定處理收集/查找表的最佳做法/在RequestFactory中。GWT RequestFactory,ValueProxy或EntityProxy用於收集/查找表

例如,如果我已經以下兩個域對象:在Experiment表使用一個ForeignKeyÑrealtionship ExperimentUnitOfMeasure之間:

@Entity 
public class Experiment { 
    private Long id; 
    private String name; 

    @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
    private UnitOfMeasure unitOfMeasure; 

    public Experiment() { } 

    public String getName() { 
     return name; 
    } 
    public Long getId() { 
     return id; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public UnitOfMeasure getUnitOfMeasure() { 
     return unitOfMeasure; 
    } 

    public void setUnitOfMeasure(UnitOfMeasure unitOfMeasure) { 
     this.unitOfMeasure = unitOfMeasure; 
    } 
} 

@Entity 
public class UnitOfMeasure { 
    private Long id; 
    private String unit_type; 

    public UnitOfMeasure() { } 

    public String getUnitType() { 
     return unit_type; 
    } 
    public Long getId() { 
     return id; 
    } 
    public void setUnitType(String unitType) { 
     this.unit_type = unitType; 
    } 
} 

這是一個正常的單向1。
我有限量的不同的UnitOfMeasure實例通常不會改變。

Web應用程序提供了一個視圖,用戶可以在其中更改Experiment實例的某些屬性。該視圖使用Editor framework。若要更改特定ExperimentUnitOfMeasure,我使用ValueListBox並呈現unit_type屬性。

由於可UnitOfMeasure實例列表是靜態的我用AutoBeanFactory創建我放到HTML主頁和應用程序在啓動過程中我分析它(對於所有其他收集如表值同樣的事情)JSON字符串,並將其儲存在一個Singleton類實例(AppData),我傳遞給`setAcceptableValues``。

目前我得到UnitOfMeasureProxyEntityProxy但爲了解碼/與AutoBeanFactory我有EntityProxyCategory註釋工廠編碼。我以某種方式懷疑ValueProxy會更合適。
但是,使用ValueProxy當我更改特定ExperimentUnitOfMeasure時,整個ValueProxy實例通過線路傳輸。
從數據庫的角度來看,只需要更改Experiment表中的外鍵值。

那麼最好的做法是什麼(ValueProxy vs EntityProxy)分別收集像表和子值?

回答

1

在許多情況下,對其他實體的引用最好使用它們的ID進行建模,而不是使用它們自己的ID(這是有爭議的,但我認爲對於服務器端代碼也是如此,或者實際上任何跨越單元 - 工作邊界-JPA EntityManager生存期,休眠會話等 - )

順便說一句,序列化RequestFactory代理的正確方法是使用ProxySerializer
請確保您使用GWT 2.5.0-RC1但如果你有ValueProxy小號名單(見issue 6961

+0

感謝您與''ProxySerializer''尖端。不知道這一點。但是,如果我只通過它們的ID來引用模型引用,那麼這不會完全破壞ORM層/ /''RequestFactory''的目的嗎? 在「Person」和「Address」的傳統示例中,如果我只通過ID而不是實體本身對「Address」和「Person」之間的關係建模,我必須確保手動當我想要顯示地址時傳送地址?同樣的事情適用於後端?如果我想輕鬆遍歷從人到地址怎麼辦?只有ID我必須從數據庫中獲取它? –

+0

您可以將關係映射爲只讀,並且ID可寫;即'AddressProxy getAddress()'和'int getAddressId(); void setAddressId(int id)'。不過,就個人/地址用例而言,這不太可能是跨會話;這與你的'UnitOfMeasureProxy'不一樣(你在應用程序的整個生命週期中保存在緩存中) –

+0

啊,我明白了。我想我可以爲集合做同樣的事情,像子值(''UnitOfMeasureProxy''),這些值在應用程序啓動時加載一次,而且無論父實體如何都是靜態的。在這種情況下,我可能也會根據實際的實體忽略getter,因爲我已經緩存/加載了所有可用類型的列表。在這種情況下,我可能可以使用普通的「ListBox」而不是「ValueListBox」。 –