2012-05-08 45 views
2

现在我正在使用entitymanager将对象实体列表插入数据库中,使用我的dao使用这样的代码。Hibernate EntityManager persist()和数据库往返计数

@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(); 
     } 
    } 
} 

当我监视加入到应用上下文

<property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
          <property name="showSql" value="true"/> 
     </bean> 
    </property> 

这个SQL语句,结果在控制台看起来就像这样

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

只需在调用flush()之前添加一条日志语句,您就可以自己看到。 –

回答

1

如果在休眠JPA需要配料,可以尝试设置

<property name="hibernate.jdbc.batch_size" value="100" /> 

按照JPA规范:

的管理实体X将在或之前 交易被输入到数据库中提交或冲洗操作的结果。

因此,flush是数据库往返行程。

顺便说一句,如果你使用spring(事务)的hibernate-jpa,那么spring将为你管理事务。您不必调用em.flush(理想情况下)

相关问题