[英]Hibernate and Spring Transaction Manager: Transaction Not Successfully Started
我有一个通用存储库,带有一个名为saveList()的方法。 此方法的目的是获取一个List并将其保留在500个对象的“块”中。 不幸的是,当我进入提交时,我收到“ TransactionException:事务未成功启动”的信息。
我所看到的一切都说这是Spring事务管理器的结果。 不幸的是,对于这种特定方法,我需要手动控制事务。
相关代码如下:
// 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>
任何帮助表示赞赏。
您同时使用了声明式和程序化事务划分。 摆脱session.beginTransaction()
和相关的方法调用。 仅使用@Transactional。
使用openSession方法获取会话对象,并在完成工作后将其关闭。 它将完美地工作。 例如
Session session = sessionFactory.openSession();
如果必须使用手动事务,则摆脱顶部的声明性@Transactional
选项。
我真的看不出这样做的意义,因为在两次刷新之间不会清除会话(因此将需要与在事务结束时让Hibernate刷新一样多的内存),但是如果您确实想这样做这,并且只想为此方法进行新的交易,只需使用
@Transactional(propagation = Propagation.REQUIRES_NEW)
忘记了Hibernate事务管理。
这将使Spring暂停当前事务(如果有),启动新事务,执行您的方法并提交/回滚新事务,然后恢复已暂停的事务(如果有)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.