【问题标题】:persistence within a flow流中的持久性
【发布时间】:2011-09-09 09:26:25
【问题描述】:

我使用 spring 3.0、spring-webflow 2.3、zk 5.0.7、zkspring 3.0 和 hibernate 实现了一个小型网络应用程序。

其中一个流程显示了一个任务板(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,我问自己这是否是在我的流之前持久化更改的正确方法。

有什么建议吗?

【问题讨论】:

    标签: spring zk


    【解决方案1】:

    根据您引用的文章 (Flow-managed persistence in Spring Web Flow 2),在 webflow 结束之前提交事务属于“非原子流”类别。 实现“原子流”或“非原子流”取决于您的用例。所以这取决于你的主要流程是否应该是“原子的”? 如果它在您的用例中是原子的,您应该坚持任务并在 Web 流结束时提交。作为任务状态,我认为 flowscope 变量可以满足您的要求。 如果它不是 aotmic,那么您肯定可以在流程结束之前提交它。您仍然可以利用流管理上下文来持久化您的新任务。 只需使用“Spring Web Flow 2 中的流管理持久性”中的“非原子 Web 流”中描述的 @Transactional(readOnly = true) 设置您的方法。

    @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;
    }
    

    【讨论】:

    • 我知道这是一篇旧帖子,但我认为您的意思是 @Transactional(readOnly=false) 在您的段落中。感谢您的帖子,让我知道在持久性上下文中仍然可以。 +1
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2017-01-15
      • 2013-07-17
      • 2021-06-20
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多