现在我正在使用entitymanager使用我的dao使用这样的代码将对象实体列表插入数据库。
@Transaction
public void insertBatch(List<EntityObject> o){
for(int i=0;i<o.size();i++){
em.persist(o);
if(o.size % 100 == 0){ //equal to JDBC batch size
em.flush();
em.clear();
}
}
}
当我通过将其添加到application-context
中来监视sql语句时 <property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true"/>
</bean>
</property>
控制台中的结果将如下所示
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
...
...
...//untill reach 100 lines.
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
我的问题是。 这是否意味着每当我调用此方法时,它将使用数据库往返100次,或者它只进行1次往返,否则?
任何答案或见解都会受到赞赏。
感谢。
答案 0 :(得分:1)
如果您需要在hibernate jpa中进行批处理,请尝试设置
<property name="hibernate.jdbc.batch_size" value="100" />
根据JPA规范:
管理实体X将在或之前输入数据库 事务提交或刷新操作的结果。
因此,flush是数据库往返。
顺便说一句,如果你使用带有spring(事务)的hibernate-jpa,那么spring将为你管理事务。你不需要调用em.flush(理想情况下)