1

我正在尝试创建一个类似向导的注册,其中我有多个页面,每个页面都有一个表单和一个“保存并继续”按钮。我想将每个表单的数据保存在休眠会话中,并仅在用户确认时在注册结束时将其保存在数据库中。我不是 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 中检索它?

4

1 回答 1

0

有很多可能的场景:

1.您的 ActionHandler 应该是一个(会话)单例 - 因此您不需要休眠事务。您可以简单地在 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。也许这对您来说是一个很好的选择。

于 2013-03-02T17:59:40.853 回答