Hibernate + GWTP:跨多个请求的会话

时间:2012-12-28 12:54:57

标签: hibernate session wizard gwtp

我正在尝试创建一个类似向导的注册,其中我有多个页面,每个页面都有一个表单和一个“保存并继续”按钮。 我想在休眠会话中保存每个表单的数据,并在用户确认时仅在注册结束时将其保存在DB上。 我不是Hibernate专家,但我明白我需要创建一个“长会话”。我怎么做?我是否通过保持交易开放来做到这一点?如何从一个请求中检索“脏”实体到另一个请求? 假设我们有一个GWTP动作处理程序,可以执行类似这样的操作

//page1 action           
public myAction1Result execute(myAction1Action action,ExecutionContext context) throws ActionException {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.getTransaction().begin();

    User entityUser = new User();
    entityUser.setName(action.getName());
    session.save(entityUser); 

    return new myAction1Result();
}

在事务处于打开状态之前,userEntity不会保存在数据库中并且是暂时的。我如何在另一个actionHandler中检索它?

1 个答案:

答案 0 :(得分:0)

有很多可能的情况:

1。 你的ActionHandler应该是一个(会话)单例 - 因此你不需要一个hibernate事务。您只需在ActionHandler实例中编辑并保存该对象即可。工作流程完成后,您可以调用单独的操作(例如RegisterUserWorkflowCommitAction),该操作将注入主ActionHandler并提交您编辑的对象。

2。 使用transaction.merge(user)

//...
@Singleton
public class RegisterUserWorkflowActionHandler //...
//...
transaction = session.beginTransaction();
session.merge(action.getUser());
transaction.commit();
//...

3。 使用(单例)ActionHandler中的字段保存事务。

//...
@Singleton
public class RegisterUserWorkflowActionHandler //...
//...
if(this.getOpenTransaction() == null) {
    this.setOpenTransaction(session.beginTransaction())
}
//...

4。 可以看一下Errai JPA。也许这对你来说是一个很好的选择。