我有一个Generic Repository,其方法名为saveList()。 此方法的目的是获取一个List并将其保存在500个对象的“块”中。 不幸的是,当我进入提交时,我收到了“TransactionException:事务未成功启动”。
我见过的所有内容都说这是Spring Transaction Manager的结果。 不幸的是,对于这种特殊方法,我需要手动控制事务。
相关代码如下:
// from generic non-abstract repository @Transactional public void saveList(List<T> objectList) { Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); int i = 1; for (T obj : objectList) { session.save(obj); //sessionFactory.getCurrentSession().save(obj); i++; if (i % 500 == 0) { session.flush(); //sessionFactory.getCurrentSession().flush(); } } if (!tx.wasCommitted()) { tx.commit(); } //sessionFactory.getCurrentSession().getTransaction().commit(); }从applicationContext.xml配置:
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>任何帮助表示赞赏。
I have a Generic Repository with a method named saveList(). The purpose of this method is to take a List and persist it in "chunks" of 500 objects. Unfortunately, I'm getting a "TransactionException: Transaction not successfully started" when I get to the commit.
Everything I've seen says that this is a result of the Spring Transaction Manager. Unfortunately, for this particular method, I need to manually control the transaction.
Relevant code is below:
// from generic non-abstract repository @Transactional public void saveList(List<T> objectList) { Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); int i = 1; for (T obj : objectList) { session.save(obj); //sessionFactory.getCurrentSession().save(obj); i++; if (i % 500 == 0) { session.flush(); //sessionFactory.getCurrentSession().flush(); } } if (!tx.wasCommitted()) { tx.commit(); } //sessionFactory.getCurrentSession().getTransaction().commit(); }Configuration from applicationContext.xml:
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>Any assistance is appreciated.
最满意答案
您正在使用声明式和程序式事务划分。 摆脱session.beginTransaction()和相关的方法调用。 只使用@Transactional。
You're using both declarative and programmatic transaction demarcation. Get rid of the session.beginTransaction() and related method calls. Only use @Transactional.
更多推荐
发布评论