Spring MVC中的JPA Hibernate批量/批量更新

use*_*197 8 hibernate jpa spring-mvc jpa-2.0 spring-data-jpa

我是Spring MVC的新手,对JPA也不太了解.我想要做的就是更新记录列表,当我遍历列表并在DAO上调用update时,它的工作正常.

但我不想执行100次更新/插入操作或数据库往返.

任何人都可以告诉我如何使用批量更新更新大约100条记录,而不是执行以下操作:

Controller:
    List<MyEntity> list = form.getList();
    for(MyEntity e : list){
        dao.update(e);
    }

Dao:
    public T update(T entity){
         entityManager.merge(entity);        
    }
Run Code Online (Sandbox Code Playgroud)

是否有可能,如果有人能为我提供一种简单的方法来执行批量更新.如果我得到尽可能多的解释,我将非常感激.

谢谢

inc*_*.de 5

你所拥有的几乎是通过JPA更新多行的标准方法.事件spring-data-jpa暴露了封面下的save(Iterable<T> items)循环Iterator.是另一个在选项上得到很好回答的问题,但简而言之,你正处于正确的道路上,另一种选择就是自己制定并执行更新语句.

更新:在单个事务中执行可能会提高性能,因为您只有一次事务开销.您还可以获得如果其中一个更新失败,任何以前的更新也会回滚的情况.(所以,你可能会失去之前更新的所有"工作" - 你可能想要也可能不想要)

另外,请注意您正在使用的事务管理器类型(例如JTA或JPA)和JPA实现(例如Hibernate),因为有时它们并不能很好地协同工作.

所以,在您的DAO代码中,您可能想要这样做;

  • 添加重载update(Iterator<Entity> entities)代码
  • 在该代码中执行以下操作;

    entityManager.getTransaction().begin();//start the transaction

    for (Entity entity : entities) {

        entityManager.merge(entity);//update an entity
    
    Run Code Online (Sandbox Code Playgroud)

    }

    entityManager.getTransaction().commit();//complete the transaction

  • 或者您可以@Transactionalsave(Iterable<Entity> entities)方法上使用注释.确保在Spring Context中也有事务注释支持