8

我是 Spring MVC 的新手,对 JPA 也不太了解。我要做的就是更新记录列表,并且当我遍历列表并在 DAO 上调用更新时它运行良好。

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

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

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

Dao:
    public T update(T entity){
         entityManager.merge(entity);        
    }

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

谢谢

4

1 回答 1

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
    

    }

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

  • 或者你可以在你的方法上使用@Transactional注释。save(Iterable<Entity> entities)确保您在 Spring Context 中也有事务注释支持
于 2013-07-13T11:24:00.363 回答