我刚刚开始使用其他人编写的一个功能,该功能似乎效率稍低,但我对 JPA 的了解并不足以找到非 Hibernate 特定的可移植解决方案。
简而言之,在循环中调用的 Dao 方法插入每个新实体会执行“entityManager.merge(object);”。
JPA 规范中是否定义了一种方法来将实体列表传递给 Dao 方法并进行批量插入,而不是为每个对象调用合并?
另外,由于 Dao 方法是用“@Transactional”注释的,我想知道是否每个合并调用都发生在它自己的事务中......这对性能没有帮助。
任何想法?
不,普通 JPA 中没有批量插入操作。
是的,每个插入都将在其自己的事务中完成。这@Transactional
属性(没有限定符)意味着传播级别REQUIRED
(如果交易尚不存在,则创建交易)。假设您有:
public class Dao {
@Transactional
public void insert(SomeEntity entity) {
...
}
}
你做这个:
public class Batch {
private Dao dao;
@Transactional
public void insert(List<SomeEntity> entities) {
for (SomeEntity entity : entities) {
dao.insert(entity);
}
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
这样,整个插入组就被包装在一个事务中。如果您正在谈论大量插入,您可能需要将其分成 1000 个、10000 个或任何大小的组,因为足够大的未提交事务可能会导致数据库资源匮乏,并且可能仅由于大小而失败。
Note: @Transactional
是一个Spring注解。看交易管理 http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html来自Spring参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)