Hibernate EntityManager persist() и количество обращений к базе данных
Прямо сейчас я использую 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 поездка в оба конца, или еще?
Любой ответ или понимание будет оценено.
Благодарю.
1 ответ
Если вам нужно пакетировать в спящем jpa, попробуйте установить
<property name="hibernate.jdbc.batch_size" value="100" />
Согласно спецификации JPA:
Управляемый объект X будет введен в базу данных во время или до принятия транзакции или в результате операции очистки.
Итак, flush - это база данных.
Кстати, если вы используете hibernate-jpa с Spring (транзакция), то Spring будет управлять транзакциями для вас. Вам не нужно звонить em.flush (в идеале)