虽然这里还有其他类似的问题,但我没有看到任何问题可以解决所有问题或有一个很好的明确答案。本质上,我正在使用 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?
最佳答案
我可以解释有关 Hibernate 在使用身份生成器时禁用批量插入的声明。
为了让 Hibernate 使用身份生成器获取新实体的标识符,它必须实际执行到数据库的插入,然后执行选择来获取该标识符值,因为该值是由数据库在插入时分配的。这与使用序列生成器形成对比。在这种情况下,Hibernate 可以预先获取尽可能多的标识符(如果需要,可以批量获取),并在插入之前将它们分配给要插入的实体。
因此,区别在于用于身份生成器的“插入然后选择”与用于序列的“选择然后插入”。
因此,当使用身份生成器时,Hibernate 必须逐一执行插入,但当使用序列生成器时,Hibernate 可以将它们批量化。
关于hibernate - 使用 JPA 和 Hibernate 进行高效批量/批量插入的 final方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884765/