【发布时间】:2016-11-20 07:26:53
【问题描述】:
好吧,我正在尝试在 JPA 中进行批量插入,但我认为这不起作用。
我的方法是这样的:
public void saveBatch(List<? extends AbstractBean> beans) {
try {
begin();
logger.info("Salvando em batch " + beans.size() + " bean(s)");
for (int i = 0; i < beans.size(); i++) {
if (i % 50 == 0) {
entityManager.flush();
entityManager.clear();
}
entityManager.merge(beans.get(i));
}
commit();
} catch (Exception e) {
logger.error("Ocorreu um erro ao tentar salvar batch. MSG ORIGINAL: "
+ e.getMessage());
rollback();
throw new DAOException("Ocorreu um erro ao tentar salvar batch");
}
}
我的想法是休眠将每 50 行:
insert into tableA values (),(),()...
但是查看日志我看到每个 merge() 命令都有一个 INSERT 链接:
insert into tableA values ()
insert into tableA values ()
insert into tableA values ()
insert into tableA values ()
怎么了?这是正确的?
【问题讨论】:
-
你的 JPA impl 是什么。它取决于。您是否修改了 JPA conf 以启用它?如果是,如何?
-
我的 jpa 是 2.1,使用休眠。我没有在 jpa 配置中修改任何内容。
-
你的假设是错误的。 Hibernate 不会生成单个庞大的 SQL 语句,而是会采用一批(插入)语句(在您的情况下为 50 个)并在一次往返中同时将它们传递到数据库中(当
EntityManager#flush()(或最后提交) ) 被执行) -
我读过这篇文章,但我已经在使用 entityManager 和最低值批量大小 = 50