如何使用实体管理器和标准在休眠中创建批量更新?
How to create batch update in hibernate with entity manager and criteria?
我只是尝试在 bd 中创建批量更新,但遇到了问题。
我读了很多文章,所有文章都手动管理会话,我不想这样做。我如何为我的实体创建批量更新我编写了以下代码:
@Transactional(propagation = Propagation.REQUIRED)
public void update(List<MyClass> objects) {
for (MyClass o: objects) {
getEntityManager().merge(o);
}
}
此外,我添加了以下属性
hibernate.jdbc.batch_size=32
我哪里错了?
首先,如果 "MyClass" 是一个版本控制的实体,那么您需要启用以下 属性:
hibernate.jdbc.batch_versioned_data=true
现在,您没有提及列表 "objects" 是否包含休眠管理或分离的对象。如果这些不是分离的实例,则不需要合并,因为 hibernate 已经知道实体发生的更改。
最后,您只需要使用 getEntityManager().flush() 刷新会话;
这应该刷新对数据库的所有更改,并且休眠应该执行它的批处理魔法。
这篇关于批处理的指南应该会有帮助:https://vladmihalcea.com/how-to-batch-insert-and-update-statements-with-hibernate/
我只是尝试在 bd 中创建批量更新,但遇到了问题。 我读了很多文章,所有文章都手动管理会话,我不想这样做。我如何为我的实体创建批量更新我编写了以下代码:
@Transactional(propagation = Propagation.REQUIRED)
public void update(List<MyClass> objects) {
for (MyClass o: objects) {
getEntityManager().merge(o);
}
}
此外,我添加了以下属性 hibernate.jdbc.batch_size=32
我哪里错了?
首先,如果 "MyClass" 是一个版本控制的实体,那么您需要启用以下 属性:
hibernate.jdbc.batch_versioned_data=true
现在,您没有提及列表 "objects" 是否包含休眠管理或分离的对象。如果这些不是分离的实例,则不需要合并,因为 hibernate 已经知道实体发生的更改。
最后,您只需要使用 getEntityManager().flush() 刷新会话; 这应该刷新对数据库的所有更改,并且休眠应该执行它的批处理魔法。
这篇关于批处理的指南应该会有帮助:https://vladmihalcea.com/how-to-batch-insert-and-update-statements-with-hibernate/