2012-05-08 1 views
2

En ce moment j'utilise entitymanager pour insérer la liste de l'entité objet à la base de données avec mon dao en utilisant un code comme celui-ci.Hibernate EntityManager persist() et le nombre de trajets aller-retour de la base de données

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

Et quand je surveille l'instruction SQL par ajouter ceci dans l'application contexte

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

Et le résultat dans la console ressemblera à ceci

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 (?, ?) 

Ma question est. Cela signifie-t-il que chaque fois que j'appelle cette méthode, il va faire un aller-retour avec la base de données pour 100 fois, ou est-ce seulement 1 aller-retour, ou autre?

Toute réponse ou information serait appréciée.

Merci.

+0

Ajoutez simplement une instruction de journal avant l'appel à flush() et vous verrez par vous-même. –

Répondre

1

Si vous avez besoin batching dans JPA mise en veille prolongée, essayez de

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

Selon spécification JPA:

L'entité gérée X sera entré dans la base de données ou avant transaction commettras ou un résultat de l'opération de rinçage.

Donc, flush est l'aller-retour de la base de données. Par ailleurs, si vous utilisez hibernate-jpa avec spring (transaction), spring gérera les transactions pour vous. Vous n'avez pas besoin d'appeler em.flush (idéalement)

Questions connexes