1

各ページにフォームと「保存して続行」ボタンがある複数のページがあるウィザードのような登録を作成しようとしています。各フォームのデータを休止状態のセッションに保存し、ユーザーが確認したときに登録の最後にのみ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 は DB に保存されず、一時的なものになります。別のactionHandlerで取得するにはどうすればよいですか?

4

1 に答える 1

0

考えられるシナリオは多数あります。

1. ActionHandler は (セッション) シングルトンである必要があります。したがって、休止状態のトランザクションは必要ありません。ActionHandler インスタンスでオブジェクトを編集して保持するだけです。ワークフローが終了したら、メインの ActionHandler を注入し、編集したオブジェクトをコミットする別のアクション (RegisterUserWorkflowCommitAction など) を呼び出すことができます。

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 に答える