2011-05-31 81 views
3

在我的JSF應用程序中,我有一段非常簡單的代碼。我希望用戶選擇在<h:selectOneMenu>從收集一個值:<h:selectOneMenu>和從休眠狀態延遲加載

<h:selectOneMenu value="#{bean.value}"> 
    <f:selectItems value="#{dao.valuesFromDb}" /> 
</h:selectOneMenu> 

#{bean.value}Region類型,#{dao.valuesFromDb}回報Regions名單。問題是,在bean中的Region從休眠狀態延遲加載,它包裝在一些包裝中,類看起來像[email protected]

如果#{bean.value}設置了某個值,則應該在頁面上預先選擇它,如果它在值列表中(#{dao.valuesFromDb})。問題是由equals方法檢查,由於類型不同,返回false

如何解決這個問題?是否有可能強制JSF不使用equals,但以某種方式自己處理這種比較?覆蓋equals所以它忽略類型是恕我直言,真的很糟糕的主意,因爲它可以打破equals對稱性。

回答

0

在這種情況下,我會通過熱切地獲取bean中的Region來避免這個問題。

與僅僅獲取JSF想要進行比較的信息相比,使用equals()會產生更少的清晰代碼。正如你指出的那樣,這可能會產生意想不到的後果。

+0

我根本做不到。我們有許多依賴實體,並且我們剛剛超過了單個查詢中的連接限制。我們不得不改變一些急切的加載到懶惰。 – amorfis 2011-05-31 20:34:52

+0

有趣的問題。 當我遇到類似的問題時(深圖),我已經分別關聯了相關對象並將其設置在目標bean上。我必須這樣做才能避免由於多個集合而導致的笛卡爾聯接。 – 2011-05-31 21:33:20

+0

我們也有笛卡爾聯接的一些問題。你能分享一些解釋它的鏈接嗎? – amorfis 2011-06-01 07:34:39

0

我們決定在我們的Override'equals'方法中解決這個問題。重要的技巧是不要在equals方法中直接引用外部對象的屬性,但始終使用getter。然後Hibernate似乎從javassist對象內挖掘出正確的值。

在你的情況下,地區equals方法應該是這個樣子:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) {return true;} 
    if (obj == null) {return false;} 
    if (!(obj instanceof Region)) {return false;} 

    Region region = (Region) obj; 

    if ((name == null) && (region.getName() != null)) {return false;} // Do NOT use 'region.name' here 
    else if (!name.equals(region.getName())) {return false;}   // Do NOT use 'region.name' here 
    return true; 
} 
0

而不是改變取類型躍躍欲試,您可以通過在動作調用Region吸氣預先加載豆(中控制器),轉發給你的看法。 I.e:只需撥打bean.getRegion()方法即可。

這樣你就不會得到LazyInitializationException(如果這就是你所得到的)。