Java 在会话中保存模型

Java 在会话中保存模型,java,session,model,wicket,Java,Session,Model,Wicket,我将Martijn的方法用于实体模型: 我使用EntityModel在自定义wicket会话中存储数据 private IModel<Order> order; private IModel<User> user; 私有IModel命令; 私有IModel用户; 设置如下: getSession().setOrder(new EntityModel<Order>(order)); getSession().setOrder(新的EntityModel

我将Martijn的方法用于
实体模型

我使用
EntityModel
在自定义wicket会话中存储数据

 private IModel<Order> order;
 private IModel<User> user;
私有IModel命令;
私有IModel用户;
设置如下:

getSession().setOrder(new EntityModel<Order>(order));
getSession().setOrder(新的EntityModel(order));
我的应用程序是一个类似向导的订单事务,大约有7、8个连接页面。在一些页面中,一堆对象被持久化,但不是全部。因此,使用
EntityModel
只允许在会话中存储未持久化的对象,而持久化的对象只保存唯一的ID

问题是从未调用
detach()
方法,因为模型不在任何组件中

  • 将模型保存到会话中是正确的方法吗
  • 我是否必须在每个型号的会话中手动调用
    detach()

不,在会话中存储模型不是一个好主意。Wicket会话由具有不同生命周期的不同请求共享,因此由不同的线程共享。以这种方式共享对象将导致各种微妙的问题

相反,您应该只共享对象的ID,并为每个请求创建一个新模型。您甚至可以创建多个模型,并依靠会话缓存和二级缓存来解决任何性能问题

或者,您可以将数据存储为RequestCycle的元数据。如果你愿意,你可以用我的电脑

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

不,在会话中存储模型不是一个好主意。Wicket会话由具有不同生命周期的不同请求共享,因此由不同的线程共享。以这种方式共享对象将导致各种微妙的问题

相反,您应该只共享对象的ID,并为每个请求创建一个新模型。您甚至可以创建多个模型,并依靠会话缓存和二级缓存来解决任何性能问题

或者,您可以将数据存储为RequestCycle的元数据。如果你愿意,你可以用我的电脑

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

通常,将模型附加到组件上会更容易,这样Wicket就可以为您进行分离,但是对于多个页面之间共享的模型,您当然可以这样做。这就是databinder中处理用户模型的方式,我已经将此策略用于其他高度共享的模型

如果您正在Wicket的WebSession的自定义扩展中存储内容,则可以在扩展中重写Wicket类的
detach()
方法:

@Override
protected void detach() {

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

    super.detach();
}

通常,将模型附加到组件上会更容易,这样Wicket就可以为您进行分离,但是对于多个页面之间共享的模型,您当然可以这样做。这就是databinder中处理用户模型的方式,我已经将此策略用于其他高度共享的模型

如果您正在Wicket的WebSession的自定义扩展中存储内容,则可以在扩展中重写Wicket类的
detach()
方法:

@Override
protected void detach() {

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

    super.detach();
}

我认为会话是一个用户绑定的实例,根本没有共享。关于只保存对象的ID:如果对象有ID,
EntityModel
也会这样做。您的
RequestCycleCache
看起来很有趣,但似乎是一种(不希望的)解决方法……Wicket会话绑定到用户会话,是的。但是没有人阻止用户提交并发请求。因此,您必须确保用户实例绑定到请求周期(或请求、页面或组件),而不是会话。我知道Martijn的EntityModel本身存储ID,但是模型并不用于会话范围。我认为会话是一个用户绑定的实例,没有任何共享。关于只保存对象的ID:如果对象有ID,
EntityModel
也会这样做。您的
RequestCycleCache
看起来很有趣,但似乎是一种(不希望的)解决方法……Wicket会话绑定到用户会话,是的。但是没有人阻止用户提交并发请求。因此,您必须确保用户实例绑定到请求周期(或请求、页面或组件),而不是会话。我知道Martijn的EntityModel本身存储ID,但是模型并不用于会话范围。