2011-12-21 10 views
1

一括挿入を行う必要があります。追加するIDを必要とします。これは私が何をしているのかを示す基本的な例です(これは明らかにパフォーマンスにとって恐ろしいことです)。私はこれを行うもっと良い方法を探しています。場合上記持続にidsが必要なSpring/Hibernate経由の一括挿入

public void omgThisIsSlow(final Set<ObjectOne> objOneSet, 
          final Set<ObjectTwo> objTwoSet) { 
    for (final ObjectOne objOne : objOneSet) { 
     persist(objOne); 
     for (final ObjThree objThree : objOne.getObjThreeSet()) { 
      objThree.setObjOne(objOne); 
      persist(objThree); 
     } 
     for (final ObjectTwo objTwo : objTwoSet) { 
      final ObjectTwo objTwoCopy = new ObjTwo(); 
      objTwoCopy.setFoo(objTwo.getFoo());     
      objTwoCopy.setBar(objTwo.getBar()); 
      persist(objTwoCopy); 

      final ObjectFour objFour = new ObjectFour(); 
      objFour.setObjOne(objOne); 
      objFour.setObjTwo(objTwoCopy); 
      persist(objFour); 
     } 
    } 
} 

は、内部IDとそれに基づくバルク挿入を取り戻すの最適化方法はあり

sessionFactory.getCurrentSession().saveOrUpdate(); 

を呼び出す方法は?

ありがとうございます!

更新:それはJustinKSU

import javax.persistence.*; 
@Entity 
public class ObjectFour{ 
    @ManyToOne(cascade = CascadeType.ALL) 
    private ObjectOne objOne; 
    @ManyToOne(cascade = CascadeType.ALL) 
    private ObjectTwo objTwo; 
} 

//そして、あなたはただ見ていると仮定すると

答えて

2

アノテーションを使用してリレーションシップを定義し、適切なカスケードを定義する場合は、Javaのオブジェクト内のオブジェクトリレーションシップを設定し、すべてを1回の呼び出しで保持できる必要があります。 Hibernateは外部キーの設定を処理します。

ドキュメンテーション - http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

親オブジェクト上の例アノテーションは、子オブジェクトに

@OneToMany(mappedBy = "foo", fetch = FetchType.LAZY, cascade=CascadeType.ALL) 

だろうあなたは私はわからないんだけど、次の

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "COLUMN_NAME", nullable = false) 
+0

この例がありますか?注釈と適切なカスケードの意味がわかりません。 – user973479

+0

もし私がobjFourを永続化しようとすると(理論上は他のものが残る)、org.hibernate.PropertyValueException:ヌルまたは一時的な値を参照するnull以外のプロパティを参照します。 – user973479

+0

XMLまたはアノテーションを使用してHibernateを構成していますか? – JustinKSU

0

を永続化する必要がある他のクラスとそのオブジェクトについても同様の以下の追加や助けを借りて作業ガット大量のデータを一度に保存すると問題は、さまざまな関連オブジェクトが永続化されているためにIDがどのようなものになるのかわからないということです。そのための1つの解決策は、すべての挿入を(バルク挿入)を一時的なID(およびいくつかのセッションID)を持つ補助テーブル(実テーブルあたり1つ)に変換し、ストアドプロシージャp IDを解決している間に挿入を実際のテーブルにerformしてください。

1

を行うだろうが、 Hibernateは一括挿入/更新を行います。私が理解している問題は、子オブジェクトへの参照を割り当てるために親オブジェクトを保持する必要があることです。

私はすべての "1つの"オブジェクトを永続化しようとします。そして、それらの "3つの"オブジェクトをすべて反復し、2回目の一括挿入でそれらを保持します。

ツリーに3つのレベルがある場合、すべての挿入を3つのバッチで実行できます。かなりまともな私は思う。