2011-09-09 15 views
0

私は、スプリング3.0、スプリングウェブフロー2.3、zk 5.0.7、zkspring 3.0、および休止状態の小さなWebアプリケーションを実装しました。フロー内の永続性

フローの1つにタスクを表すタスクボード(zk-borderlayout)がパネルに表示されています。ユーザーが新しいタスクを追加すると、フロー管理された永続性を持つ新しいサブフローが開始されます。新しいタスクは、フローの最後に保持されます。すべてがうまくいきます。

タスクのステータス(「not startetd」、「ongoing」...)を変更するために、ユーザーはタスクボード上でパネルをドラッグアンドドロップすることができます。タスクの新しいステータスは、最後ではなく、前述のフロー内で維持される必要があります。私はこの機能を、コンポーネントのonDropリスナーのDAO(下記参照)の特別な更新メソッドを呼び出すことによって実現しました。それもうまく動作します。

public void updateNow(Task task) { 
    EntityManager em = getJpaTemplate().getEntityManagerFactory().createEntityManager(); 
    EntityTransaction tx = em.getTransaction(); 
    tx.begin(); 
    em.merge(task); 
    tx.commit(); 
} 

Iは、フロー管理のpersitenceについてこのarticleを読んで、これは前に私の流れのへの変更を永続化する正しい方法であれば、私は自分自身に尋ねます。

提案がありますか?

答えて

1

参照されている記事(Flow-managed persistence in Spring Web Flow 2)によれば、ウェブフローの終わりがカテゴリ「非アトミックフロー」に属する前にトランザクションをコミットします。 "アトミックフロー"または "非アトミックフロー"を実装するには、ユースケースによって異なります。それはあなたのメインフローが「原子」であるかどうかに依存しますか? ユースケースでは不可能な場合は、Webフローの最後にタスクを維持しコミットする必要があります。タスクのステータスとして、私はflowscope変数があなたの要件を満たすことができると思います。 aotmicでない場合は、フローの終了前に必ずコミットできます。フロー管理コンテキストを利用して、新しいタスクを永続化することもできます。 @Transactional(readOnly = true)を使用してメソッドを設定するだけです。これについては、「Spring Web Flow 2でのフロー管理による永続化」の「非アトミックなWebフロー」を参照してください。

@Transactional(readOnly = false) 
    public Booking createBooking(Long hotelId, String username) { 
     Hotel hotel = em.find(Hotel.class, hotelId); 
     User user = findUser(username); 
     Booking booking = new Booking(hotel, user); 
     em.persist(booking); 
     return booking; 
} 
+0

私はこれが古い投稿だと知っていますが、あなたの段落の@Transactional(readOnly = false)を意味すると思います。投稿をお寄せいただきありがとうございます。私には、永続コンテキストではまだ可能です。 +1 – bphilipnyc

1

「アトミック」または「非アトミック」Webフローに関する開発者の決定です。 アトミックWebフローの場合は、フロー内のすべてのアクションメソッドに対して@Transactional(readOnly = true)を宣言し、フローの最後に<end-state commit="true"/>を適用します。 アトミックWebフローでは、@Transactional(readOnly = false)を適用すると、注釈付きメソッドの最後にトランザクションがコミットされます。ユーザー管理のトランザクションを実行する必要はありません。