【问题标题】:How can I chop down a transaction in Spring with JPA?如何使用 JPA 在 Spring 中减少事务?
【发布时间】:2009-05-20 10:52:22
【问题描述】:

我有这个代码:

run big query: Select all unprocessed objects from table A
for each result
    create or update an output object in table B
    update input object: Set it to "processed"

我想在循环体上有一个事务,即在处理完一行输入之后,应该提交更新的对象,所以当程序中止时,它不会再次处理所有行,而是从错误的行。

我正在使用 Spring 2.5、Hibernate 3.4 和 JPA(即我有一个 EntityManager)。

我该怎么做?我试图在循环中调用em.getTransaction().commit(),但 Spring 不允许这样做。

【问题讨论】:

    标签: hibernate spring jpa transactions


    【解决方案1】:

    我建议查看 spring 的 TransactionTemplate。 TransactionTemplate documentation 包含的示例准确地解决了您想要实现的目标。

    【讨论】:

      【解决方案2】:

      实体管理器读取操作不需要事务。所以我会尝试重构一个内部方法来更新行并将其设置为事务性的。请注意,它需要是公共方法才能使用@transactional。

      【讨论】:

        【解决方案3】:

        您应该使用 Hibernate 的 Session 对象。

        拥有一个 javax.persistence.EntityManager 实例(我想是“em”):

        ((org.hibernate.Session) em.getDelegate()).beginTransaction();
        

        更多信息:https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html

        【讨论】:

          【解决方案4】:

          不查看 spring 文档也不知道您的事务设置:

          首先您必须设置一个事务管理器(可能是 HibernateTransactionManager)。然后恕我直言,最好使用 Spring 的 TransactionTemplate 在它自己的事务中运行每个迭代。您必须确保 TransactionTemplate 真正启动新事务或在进入该方法时没有任何事务正在运行。

          提示:使用事务管理器的类名作为调试事务行为的日志类别。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-14
            • 2013-08-26
            • 2011-08-22
            • 1970-01-01
            • 1970-01-01
            • 2018-03-10
            • 2013-04-10
            相关资源
            最近更新 更多