便携式JPA批/大容量插入

Lan*_*lot 4 jpa insert bulk

我刚刚跳过其他人写的一个看起来效率不高的功能,但是我对JPA的了解并不是很好找到一个不是Hibernate特定的可移植解决方案.

简而言之,在一个循环内调用的Dao方法插入每个新实体都会执行"entityManager.merge(object);".

是不是在JPA规范中定义了一种方法来将实体列表传递给Dao方法并执行批量/批量插入而不是为每个对象调用merge?

此外,由于Dao方法带有"@Transactional"注释,我想知道每个合并调用是否在自己的事务中发生......这对性能没有帮助.

任何的想法?

cle*_*tus 7

没有在vanilla JPA中没有批量插入操作.

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

public class Dao {
  @Transactional
  public void insert(SomeEntity entity) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

你做这个:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,整个插入组就会被包装在一个事务中.如果您正在谈论大量插入,您可能希望将其拆分为1000,10000或其他任何组合,因为足够大的未提交事务可能会使数据库资源匮乏,并且可能由于大小而单独失败.

注意: @Transactional是一个Spring注释.请参阅Spring Reference中的事务管理.