如何使用JPA在Spring中删除事务?

时间:2009-05-20 10:52:23

标签: hibernate spring jpa transactions

我有这段代码:

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不允许这样做。

4 个答案:

答案 0 :(得分:2)

我建议看一下spring的TransactionTemplate。 TransactionTemplate documentation包含的示例可以准确地说明您要实现的目标。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您应该使用Hibernate的Session对象。

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

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

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

答案 3 :(得分:0)

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

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

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