1

以下のようなマッピングがあります。

デタッチされたCategoriesアイテム(dtoコンバーターからのHibernateクラスを含まない)を更新すると、Hibernateが最初にすべての雇用者賃金インスタンス(コレクションリンク)を削除し、次にすべての雇用者賃金エントリを1つずつ挿入することに気付きました。 -1 :(...

完全に切り離されたため、すべてのエントリを削除してから挿入する必要があることを理解しています。

しかし、私が理解していないのは、なぜHibernateが一括挿入ですべてのエントリを挿入しないのですか?..つまり、すべての雇用主の賃金エントリをすべて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>
4

1 に答える 1

0

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

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();
于 2011-11-13T09:44:09.357 に答える