2

现在我正在使用 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();
         }
    }
}

当我通过将其添加到应用程序上下文中来监视 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 次往返?

任何答案或见解将不胜感激。

谢谢。

4

1 回答 1

1

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

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

根据 JPA 规范:

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

因此,刷新是数据库往返。

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

于 2012-05-08T15:42:19.423 回答