【发布时间】:2017-06-07 18:37:33
【问题描述】:
我正在尝试编写一种将实体批量添加到数据库的方法。这是我的方法:
@Transactional
protected void bulkInsert(List<?> entities) {
int batchSize = 25;
AtomicInteger i = new AtomicInteger(0);
try {
em.getTransaction().begin();
entities.parallelStream().forEach(e -> {
em.persist(e);
if ( i.get() > 0 && i.get() % batchSize == 0 ) {
em.flush();
em.clear();
}
i.incrementAndGet();
});
em.getTransaction().commit();
} catch (RuntimeException e) {
LOG.error("Error", e);
} finally {
if (em != null) {
em.close();
}
}
}
但是当我运行它时,我收到以下错误:
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:248) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at com.sun.proxy.$Proxy145.getTransaction(Unknown Source) ~[na:na]
我尝试删除 @Transactional 注释,但仍然是同样的错误。我尝试通过 Session session = em.unwrap(Session.class); 使用 Session 但这仍然导致错误(虽然不同的错误)
如何批量插入对象?
【问题讨论】:
-
您是否尝试删除
em.getTransaction().begin();/em.getTransaction().commit();并离开@Transactional? -
@RomanPuchkovskiy 好的,我试过了,但它给了我一个错误:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526) -
包括
@Transactional,请检查您添加的包。应该是org.springframework.....。有时在不知不觉中添加javax.persistence.transactional...时会发生这种情况。
标签: java database hibernate session bulkinsert