我是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);
}
是否有可能,如果有人能为我提供一种简单的方法来执行批量更新。如果我得到尽可能多的解释,我将非常感激。
由于
答案 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中也有事务注释支持