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

时间:2013-07-13 00:51:22

标签: hibernate spring-mvc jpa jpa-2.0 spring-data-jpa

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

但我不想进行100次更新/插入操作或DB往返。

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

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

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

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

由于

1 个答案:

答案 0 :(得分:5)

你所拥有的几乎是通过JPA更新多行的标准方法。公开save(Iterable<T> items)的事件spring-data-jpa只会覆盖Iterator下的update(Iterator<Entity> entities)here另一个问题在选项上得到了很好的回答,但简而言之,你正走在正确的道路上,另一种选择就是自己制定并执行更新语句。

更新: 在单个事务中执行可能会提高性能,因为您只需要一次事务开销。您还可以获得如果其中一个更新失败,任何以前的更新也会回滚的情况。 (因此,您可能会丢失之前更新中的所有“工作” - 您可能会或可能不会想要这样做)

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

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

  • 添加重载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)方法上使用{{1}}注释。确保你在Spring Context中也有事务注释支持