2011-12-09 102 views
1

我用的Martijn的做法爲EntityModelhttp://wicketinaction.com/2008/09/building-a-smart-entitymodel/保存模型在會議

我使用EntityModel在我的自定義檢票會話存儲數據。

private IModel<Order> order; 
private IModel<User> user; 

它的設置是這樣的:

getSession().setOrder(new EntityModel<Order>(order)); 

我的應用程序是一個精靈般的訂單交易是在約7,8連頁。在一些頁面中,一堆對象被持久化,但不是全部。所以EntityModel的使用允許我只在會話中存儲未被執行的對象,而持久對象只保存唯一的ID。

問題是,從來沒有調用detach()方法,因爲該模型不在任何組件中。

  • 將模型保存到會話中是否正確?
  • 我必須在每個模型的會話中手動撥打detach()嗎?

回答

4

它通常是更容易保持連接到您的組件模型,使檢票只是做了分離你,但對於那些多頁之間共享模型,你當然可以這樣來做。這是用戶模型在數據綁定器的AuthDataSession中的處理方式,我已經使用其他大量共享模型的策略。

如果你在Wicket的WebSession您的自定義擴展存儲的東西,你可以覆蓋Wicket的Session類的detach()方法在擴展:

@Override 
protected void detach() { 

    // detach the models you're holding in your custom session 
    // by calling all their detach methods. 

    super.detach(); 
} 
1

不,在會話中存儲模型不是一個好主意。 Wicket會話由具有不同生命週期的不同請求共享,因此由不同的線程共享。以這種方式共享對象將導致各種微妙的問題。

相反,您應該只共享對象的ID併爲每個請求創建一個新模型。您甚至可以創建多個模型,並依靠會話緩存和二級緩存來吸收任何性能問題。

或者,您可以將數據存儲爲RequestCycle的元數據。如果你願意,你可以用我的RequestCycleCache這樣做。

public User getUser() { 
    return RequestCycleCache.getOrCreate(USER_KEY, _userId, FETCH_USER_FUNCTION); 
} 
+1

我想到了一個會話是沒有用戶綁定實例共享。關於只保存對象的ID:如果對象具有ID,那麼'EntityModel'也會這樣。你的'RequestCycleCache'看起來很有趣,但有點像(不需要的)解決方法... – rotsch

+0

Wicket會話綁定到用戶會話,是的。但是沒有人阻止用戶提交併發請求。因此,您必須確保User的實例綁定到請求週期(或請求,頁面或組件)而不是會話。我知道Martijn的EntityModel存儲了ID本身,但模型並不意味着在會話範圍內使用。 – sfussenegger