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