2012-01-19 11 views
3

Hibernate.I mを使用して複数のレコードをDBに保存したいのですが、私のアプローチが間違っていると思っています。私のようなDBに格納するHibernateを使用してデータベースに複数のレコードを保存する

FirstName   LastName 
FNameABC   LNameCC   
FNamePQR   LNameDD   
FNameXYZ   LNameEE 

私は、ループ内seessionに値を保存するよ、と

ここ
Iterator itr = list.Iterator(); 
while(itr.hasNext()) { 
    Test t = (Test)itr.next(); 
    dbEntity.setFirstName(t.setFirstName()); 
    dbEntity.setLastName(t.setLastName()); 
    session.beginTransaction(); 
    session.save(dbEntity); 
    session.getTransaction().commit(); 
    session.close(); 
} 

をDBで上記の値を保存。だから毎回各レコードのためにbeginTransaction()save()commit()と呼ぶでしょう。 より良いアプローチはありますか?

+0

すべての挿入は別のトランザクションで行う必要がありますか? –

答えて

3

、このページを見てみてください:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

あなたは、トランザクションを開く(ループ内)のエンティティを保存し、最後にトランザクションをコミットし、セッションを閉じる必要があります。 定期的にカウンタを設定して、特定の回数に達するとセッションを繰り返してフラッシュ/クリーンアップすることができます。

+0

多数のエンティティでこのアプローチを使用すると、定期的にセッションをフラッシュしてクリアする必要があります。多数のエンティティーをダーティーチェックするとすぐにボトルネックになります。 –

+0

ケース、エンティティの数、オープンセッションの数...場合によっては複雑なソリューションを実装する価値がありません。私の答えは、特定の状況のた​​めだけでした。私は、極端な場合には、異なるアプローチを考慮する必要があることに同意します。 –

+0

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html –

2

技術的またはパフォーマンス上の考慮事項に基づいてトランザクションを開始およびコミットすることは選択しません。あなたは、原子的に、一貫して、他のトランザクションとは独立して行われるべきと考えられるものに基づいてそれを行うことを選択します。 http://en.wikipedia.org/wiki/ACIDを読んでください。

すべての挿入が成功するか失敗するかを確認したいが、半分が成功し、残りの半分が失敗する状態にならないようにするには、トランザクションですべての挿入をカプセル化する必要があります。最初のトランザクションの前にトランザクションを実行し、最後のトランザクションの後にコミットします。

反対に、各インサートを独自のトランザクションで実行したい場合、たとえば、いずれかが失敗したにもかかわらず他のインサートを挿入した場合に例外をキャッチできるようにするには、各インサートを独自のトランザクションあなたがやっているように。