Массовая вставка коллекции компонентов в Hibernate? - PullRequest
1 голос
/ 25 января 2011

У меня есть сопоставление, как указано ниже.

Когда я обновляю отдельный элемент Категории (который не содержит ни одного класса Hibernate, как это происходит из конвертера dto), я замечаю, что Hibernate сначала удалит ВСЕХ работодателяэкземпляры заработной платы (ссылка на коллекцию), а затем вставьте ВСЕ записи заработной платы работодателя ОДИН-ПО-ОДНОМУ: (...

Я понимаю, что он должен удалить, а затем вставить все записи, поскольку он был полностью отделен.*

НО, чего я не понимаю, почему Hibernate НЕ вставляет все записи через массовую вставку? .. То есть: вставляет все записи заработной платы работодателя в один оператор SQL?

Какя могу сказать Hibernate использовать массовую вставку? (если возможно). Я попытался поиграть со следующим значением, но не увидел никакой разницы:

hibernate.jdbc.batch_size=30

Мой фрагмент кода:

<class name="com.sample.CategoriesDefault" table="dec_cats" >
 <id name="id" column="id" type="string" length="40" access="property">
  <generator class="assigned" />
 </id>
 <component name="incomeInfoMember" class="com.sample.IncomeInfoDefault">
   <property name="hasWage" type="boolean" column="inMemWage"/>
    ...
   <component name="wage" class="com.sample.impl.WageDefault">
     <property name="hasEmployerWage" type="boolean" column="inMemEmpWage"/>
      ...
     <set name="employerWages" cascade="all-delete-orphan" lazy="false">
      <key column="idCats" not-null="true" />
      <one-to-many entity-name="mIWaEmp"/>
     </set>
   </component>
 </component>
</class>

1 Ответ

0 голосов
/ 13 ноября 2011

Массовая вставка - это специальный встроенный способ быстрой вставки, обычно используемый для внешних инструментов, таких как bcp.exe для MS SQL. Вы говорите о Пакетная вставка , попробуйте использовать код, подобный следующему:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...