首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流中的持久性

流中的持久性
EN

Stack Overflow用户
提问于 2011-09-09 17:26:25
回答 2查看 1.1K关注 0票数 0

我用spring 3.0,spring-webflow 2.3,zk 5.0.7,zkspring 3.0和hibernate实现了一个小的web-app。

其中一个流显示了一个任务板(zk-borderlayout),上面有代表任务的面板。如果用户添加了新任务,我会用流管理的方式启动一个新的子流。新任务在流的末尾被持久化。一切都运行得很好。

此外,用户还可以将面板拖放到任务板上以更改状态(“未启动”、“正在进行”...)这项任务。任务的新状态应该持久化在提到的流程中,而不是在最后。我通过在组件的onDrop侦听器中调用DAO的特殊更新方法(如下所示)来实现此功能。这也很好用。

代码语言:javascript
复制
    public void updateNow(Task task) {
    EntityManager em = getJpaTemplate().getEntityManagerFactory().createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    em.merge(task);
    tx.commit();
}

我读到了这篇关于流管理的article,我问自己这是不是在我的流之前保存更改的正确方式。

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 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流”中进行了描述。

代码语言:javascript
复制
@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;
}
票数 1
EN

Stack Overflow用户

发布于 2012-04-16 11:42:51

这是开发人员对“原子”或“非原子”web流的决定。对于原子web流,在流中的所有操作方法上声明@Transactional(readOnly = true),并在流的末尾应用<end-state commit="true"/>。对于非原子web流,应用@Transactional(readOnly = false)在带注释的方法的末尾提交事务。不需要运行用户管理的事务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7359592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档