流程中的持久性

时间:2011-09-09 09:26:25

标签: spring zk

我实现了一个带有spring 3.0,spring-webflow 2.3,zk 5.0.7,zkspring 3.0和hibernate的小型web应用程序。

其中一个流程显示了一个任务板(zk-borderlayout),其上有代表任务的面板。如果用户添加了新任务,我将启动一个具有流量管理的持久性的新子流。新任务在流程结束时保持不变。 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关于流程管理的持久性的问题,我问自己这是否是在我的流程之前保持更改的正确方法。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

根据您引用的文章(Flow-managed persistence in Spring Web Flow 2),提交一个事务,因为Webflow的结尾属于“非原子流”类别。 实现“原子流”或“非原子流”取决于您的使用案例。那么这取决于你的主流应该是“原子”还是不是? 如果它在您的用例中是原子的,那么您应该在Web流程结束时保留任务并提交。作为任务状态,我认为流镜变量可以满足您的要求。 如果它不是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;
}

答案 1 :(得分:1)

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