2011-01-25 22 views
1

私は以下のようなマッピングを持っています。Hibernateでのコンポーネントコレクションの一括挿入?

デタッチされたカテゴリ項目(dtoコンバーターからのHibernateクラスは含まれません)を更新すると、Hibernateは最初にすべての雇用主賃金インスタンス(コレクションリンク)を削除し、次にすべての雇用者賃金を挿入しますエントリONE-BY-ONE:。(...

私はそれが完全に切り離されたとして、それは削除してからすべてのエントリを挿入するために持っていることを理解し、私は理解していないものを

しかし、なぜ休止状態ではありませんすべてのエントリを一括挿入で挿入しますか? つまり、すべての雇用主賃金明細をすべて1つの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> 

答えて

0

一括挿入は - 通常、高速な挿入のために特定のネイティブな方法ですMS SQL用のbcp.exeのようなネイティブの外部ツールを使用します。 あなたはおよそを一括挿入話している、この例のようなコードを使用してみてください:

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