在会话中保存模型

时间:2011-12-09 09:56:15

标签: java session model wicket

我使用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()

2 个答案:

答案 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);
}