在Hibernate / JPA中使用批量插入

时间:2016-07-17 17:28:17

标签: java hibernate jpa

好吧,我正在尝试在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 ()

有什么问题?这是对的吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,Hibernate不启用批处理。您将需要考虑以下settings(我认为至少需要batch_size才能使任何批量插入/更新生效):

hibernate.jdbc.batch_size
  

非零值允许Hibernate使用JDBC2批量更新。例如   建议值介于5到30之间

hibernate.jdbc.batch_versioned_data
  

如果JDBC驱动程序返回正确的行,请将此属性设置为true   从executeBatch()开始计算。打开此选项通常是安全的。   然后,Hibernate将使用批处理的DML来自动生成版本的数据。   默认为false。例如是的|假

hibernate.order_updates (similarly, hibernate.order_inserts)
  

强制Hibernate按主键值排序SQL更新   正在更新的项目。这将导致更少的事务死锁   在高度并发的系统中。例如是的|假