我用spring 3.0,spring-webflow 2.3,zk 5.0.7,zkspring 3.0和hibernate实现了一个小的web-app。
其中一个流显示了一个任务板(zk-borderlayout),上面有代表任务的面板。如果用户添加了新任务,我会用流管理的方式启动一个新的子流。新任务在流的末尾被持久化。一切都运行得很好。
此外,用户还可以将面板拖放到任务板上以更改状态(“未启动”、“正在进行”...)这项任务。任务的新状态应该持久化在提到的流程中,而不是在最后。我通过在组件的onDrop侦听器中调用DAO的特殊更新方法(如下所示)来实现此功能。这也很好用。
public void updateNow(Task task) {
EntityManager em = getJpaTemplate().getEntityManagerFactory().createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.merge(task);
tx.commit();
}我读到了这篇关于流管理的article,我问自己这是不是在我的流之前保存更改的正确方式。
有什么建议吗?
发布于 2011-09-26 17:44:48
根据您参考的文章(Flow-managed persistence in Spring Web Flow 2),在webflow结束之前提交事务属于“非原子流”类别。实现“原子流”或“非原子流”取决于您的用例。所以这取决于你的主流是否应该是“原子的”?如果它在你的用例中是原子的,那么你应该持久化任务并在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;
}发布于 2012-04-16 11:42:51
这是开发人员对“原子”或“非原子”web流的决定。对于原子web流,在流中的所有操作方法上声明@Transactional(readOnly = true),并在流的末尾应用<end-state commit="true"/>。对于非原子web流,应用@Transactional(readOnly = false)在带注释的方法的末尾提交事务。不需要运行用户管理的事务。
https://stackoverflow.com/questions/7359592
复制相似问题