我有这段代码:
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不允许这样做。
答案 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确实启动了新事务,或者在输入方法时没有运行任何事务。
一个提示:使用事务管理器的类名作为调试事务行为的日志类别。