Вопрос по spring, database – Hibernate EntityManager persist () и количество обращений к базе данных

2

Прямо сейчас я использую entitymanager для вставки списка объектных сущностей в базу данных с моим дао, используя такой код.

@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 поездка в оба конца, или еще?

Любой ответ или понимание будет признателен.

Благодарю.

Просто добавьте инструкцию в журнал перед вызовом flush (), и вы сами это увидите. JB Nizet

Ваш Ответ

1   ответ
1

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

Согласно спецификации JPA:

The managed entity X will be entered into the database at or before transaction commit or as a result of the flush operation.

Итак, flush - это база данных.

Кстати, если вы используете hibernate-jpa с Spring (транзакция), то Spring будет управлять транзакциями для вас. Вам не нужно звонить em.flush (в идеале)

Похожие вопросы