使用JPA和Hibernate进行高效批量/批量插入的明确方法?

时间:2011-10-25 04:36:25

标签: hibernate jpa java-ee bulk

虽然这里还有其他类似的问题,但我没有看到任何解决所有问题或有明确答案的问题。基本上我正在使用Hibernate支持的JPA在J2EE应用程序中构建数据访问和服务层。

应用程序执行大型数据加载/更新操作,我想确保它们尽可能高效地进入数据库。正确的答案将使用代码解释如何使用大量数据进行插入,更新和理想合并

  • 在配置或代码中设置批量大小,以及如何使用JPA编写代码(如果可能,不使用原始Hibernate)
  • 如何以及何时使用JPA事务命令/注释来确保高效的内存/第一/第二级缓存使用。
  • 向我解释这意味着'如果您使用身份标识符生成器,​​Hibernate会在JDBC级别透明地禁用插入批处理' - 这是否与使用主标识符序列相关?
  • 我应该知道的任何问题。

注意我已经问了一些关于Hibernate和J2EE / JPA的相关问题,如果你有什么要添加到这些,请做

两者对我来说都是相对较新的技术(参见我的其他问题):

How should EntityManager be used in a nicely decoupled service layer and data access layer?

Should raw Hibernate annotated POJO's be returned from the Data Access Layer, or Interfaces instead?

1 个答案:

答案 0 :(得分:3)

我可以在使用身份生成器时解释有关Hibernate禁用批量插入的声明。

为了让Hibernate使用标识生成器获取新实体的标识符,它必须实际执行对数据库的插入,然后执行select以获取该标识符值,因为该值是由Insert上的数据库分配的。这与使用序列发生器形成对比。在这种情况下,Hibernate可以预先获得尽可能多的标识符(如果需要,可以批量生成),并在插入之前将它们分配给它所插入的实体。

所以差异是插入然后选择标识生成器与选择然后插入序列。

因此,当使用身份生成器时,Hibernate必须逐个执行Inserts,但是在使用序列生成器时可以将它们批处理。