使用 JPA/EJB3 的批处理插入

2022-09-01 20:49:57

JPA/EJB3 框架是否提供了执行批处理插入操作的标准方法?我们使用休眠作为持久性框架,所以我可以回退到休眠会话并使用组合section.save()/session.flush()实现批量插入。但想知道EJB3是否对此有支持...


答案 1

JPA 和 Hibernate 都没有为批处理插入提供特别的支持,并且使用 JPA 的批处理插入的习语将与 Hibernate 相同:

EntityManager em = ...;
EntityTransaction tx = em.getTransaction();
tx.begin();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    em.persist(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        em.flush();
        em.clear();
    }
}

tx.commit();
session.close();

在这种情况下,使用Hibernate的专有API并不能为IMO提供任何优势。

引用

  • JPA 1.0 规范
    • 第 4.10 节 “批量更新和删除操作”
  • 休眠核心参考指南

答案 2

特别是对于休眠,核心手册的整个第13章解释了这些方法。

但是你说你希望通过Hibernate使用EJB方法,所以实体管理器文档也有一章关于这一点。我建议你同时阅读(核心和实体经理)。

在 EJB 中,它只是关于使用 EJB-QL(有一些限制)。冬眠提供了更多的机制,但如果你需要更多的灵活性。


推荐