我使用Martijn的方法来EntityModel
:http://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()
?答案 0 :(得分:4)
通常更容易将模型连接到组件上,以便Wicket为您分离,但对于在多个页面之间共享的模型,您当然可以这样做。这就是数据仓的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 :(得分:1)
不,在会话中存储模型不是一个好主意。 Wicket会话由具有不同生命周期的不同请求共享,因此由不同的线程共享。以这种方式共享对象将导致各种微妙的问题。
相反,您应该只共享对象的ID并为每个请求创建一个新模型。您甚至可以创建多个模型,并依赖会话缓存和二级缓存来吸收任何性能问题。
或者,您可以将数据存储为RequestCycle的元数据。如果您愿意,可以使用我的RequestCycleCache来执行此操作。
public User getUser() {
return RequestCycleCache.getOrCreate(USER_KEY, _userId, FETCH_USER_FUNCTION);
}