便携式JPA批/大容量插入(Portable JPA Batch / Bulk Insert)

2019-08-03 07:38发布

我只是跳上由其他人似乎略显低效写的功能,但我JPA的知识不是那么好找的便携式解决方案,这不是Hibernate的具体。

简而言之称为环路内的道的方法来插入新实体中的每一个做一个“entityManager.merge(对象);”。

心不是”有在JPA规范中定义的方式来传递的实体列表的道法,做批量/批量插入,而不是调用合并为每一个对象?

另外,因为道法的注解W /“@事务”我想,如果每一个合并呼叫自己的事务......这不会帮助提高性能之内发生的事情。

任何的想法?

Answer 1:

没有有香草JPA没有批量插入操作。

是的,每个刀片将自己的事务中完成。 的@Transactional属性(无限定符)指的传播电平REQUIRED (如果它不存在的话创建事务)。 假设你有:

public class Dao {
  @Transactional
  public void insert(SomeEntity entity) {
    ...
  }
}

你做这个:

public class Batch {
  private Dao dao;

  @Transactional
  public void insert(List<SomeEntity> entities) {
    for (SomeEntity entity : entities) {
      dao.insert(entity);
    }
  }

  public void setDao(Dao dao) {
    this.dao = dao;
  }
}

这样,插入整组被包裹在一个单一的交易。 如果你在谈论一个非常大量的插入,你可能需要将其拆分成1000,10000或作为一个足够大的未提交的事务工作的任何可能饿死的资源数据库,并单独由于可能无法尺寸组。

注: @Transactional是春注释。 见事务管理从Spring参考。



Answer 2:

你可以做什么,如果你是一个狡猾的心情是:

@Entity
public class SomeEntityBatch {

    @Id
    @GeneratedValue
    private int batchID;
    @OneToMany(cascade = {PERSIST, MERGE})
    private List<SomeEntity> entities;

    public SomeEntityBatch(List<SomeEntity> entities) {
        this.entities = entities;
    }

}

List<SomeEntity> entitiesToPersist;
em.persist(new SomeEntityBatch(entitiesToPersist));
// remove the SomeEntityBatch object later

由于级联的,这将导致在一个单一的操作要插入的实体。

我怀疑有任何实际的优势,这样在简单地在一个循环中持续单个对象。 这将是一个有趣的看的JPA实现所发出的SQL,和基准。



文章来源: Portable JPA Batch / Bulk Insert
标签: jpa insert bulk