2011-09-09 46 views
0

我實現了一個小型的Web應用程序,包括spring 3.0,spring-webflow 2.3,zk 5.0.7,zkspring 3.0和hibernate。在一個流程內的持久性

其中一個流程顯示一個任務板(zk-borderlayout),其上面板代表任務。如果用戶添加新任務,我將啓動一個具有流程管理persitence的新子流程。新任務在流程結束時保持不變。 Everythings正常工作。

除此之外,用戶還可以將面板拖放到任務板上,以更改任務的狀態(「未啓動」,「正在進行」...)。任務的新狀態應該在提到的流程中保持不變。我通過在組件的onDrop監聽器中調用DAO的特殊更新方法(見下文)來實現此功能。這也很好。

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

我讀這article有關流管理persitence,我問自己,如果這是堅持之前我流的變化的正確途徑。

有什麼建議嗎?

回答

1

根據您引用的文章(Flow-managed persistence in Spring Web Flow 2),在webflow末尾提交事務屬於「Non-atomic flow」類別。 實施「原子流」或「非原子流」取決於您的使用情況。所以這取決於你的主流應該是「原子」還是不? 如果它在你的用例中是原子的,你應該堅持任務並在Web流結束時提交。作爲任務狀態,我認爲流量變量可以滿足您的要求。 如果它不是無知的,那麼你肯定可以在流程結束之前提交它。您仍然可以利用流管理的上下文來堅持您的新任務。 只需在@Transactional(readOnly = true)中設置您的方法,該方法在「Spring Web Flow 2中的流管理持久性」中的「Non-Atomic Web Flow」中進行了描述。

@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

這是開發者對「原子」或「非原子」網絡流量的決定。 對於原子網絡流,在流中的所有操作方法上聲明@Transactional(readOnly = true),並在流結束時應用<end-state commit="true"/>。 對於非原子Web流程,應用@Transactional(readOnly = false)在註釋方法的末尾提交事務權限。不需要運行用戶管理的事務。