Hibernate EntityManager persist()和数据库往返计数

时间:2012-05-08 07:47:26

标签: database spring hibernate jpa hibernate-entitymanager

现在我正在使用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次往返,否则?

任何答案或见解都会受到赞赏。

感谢。

1 个答案:

答案 0 :(得分:1)

如果您需要在hibernate jpa中进行批处理,请尝试设置

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

根据JPA规范:

  

管理实体X将在或之前输入数据库   事务提交或刷新操作的结果。

因此,flush是数据库往返。

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