2013-07-12 5 views
20

通常私は()メソッドは、オブジェクトのみ火災INSERTのための新たな識別子を生成して保存し、それは、それを更新しない約保存読んでいながらするsaveOrUpdate()メソッドもよいINSERT又は更新レコード。違い保存とするsaveOrUpdateの方法冬眠

しかし、私の経験に従って、ここで私ができる

クラスAがある、と私はだから今

A a = getHibernateTemplate.findById(7); 

によって表Aからレコードを見つけたと、サンプルコードによって、より良い説明

そして、私はいくつかのフィールドを変更するだけで、saveメソッドでレコードを保存しようとしています。

今私は、レコードを既存だから、それだけで更新、

getHibernateTemplate.save(a); 

を発射していますが、私の知識あたりのように、新しいレコードを作成する必要があります。

私は証明書について間違っているかもしれませんが、誰かがこれについて明確にできるでしょうか?

+4

@GokcenG私は簡単なGoogle検索を実行しており、この答えに来ました。あるいは、私たちはイナーネから重複した情報を取り除くためにリファクタリングを行うべきだと言っていますか?また、これは私がGoogleの下で見た最初の答えであったので、5つの迷惑なmodのタイプがそれを偽装していないと、本当に素晴らしいだろう - 少なくとも検索のために、最も有用で正確な質問名がある中古。それは何か価値がありますか? –

答えて

23

保存

保存 methodストアデータベースに object。与えられた一時インスタンスを永続化し、最初に生成された識別子を割り当てます。 returns idエンティティが作成されました。

するsaveOrUpdate()

、一方

が存在するかしない識別子に基づいてsave()又はupdate()のいずれかを呼び出します。例えば識別子が存在する場合はupdate()が呼び出され、そうでない場合はsave()が呼び出されます。

persist()、merge()、saveOrUpdateCopy()など多くのものがあります。ほぼすべてが同じで、わずかに異なる機能性と使いやすさを提供します。

詳細については、こちらをご覧ください。 What are the differences between the different saving methods in Hibernate?

+2

あなたの答えにはタイプミスがあると思います。それを修正してください。 あなたの答えは "識別子が存在すれば、save()が呼び出されるか、そうでなければupdate()が呼び出される"と答えています。 " "識別子が存在すれば、update()が呼び出されるか、そうでなければsave()が呼び出されるはずです" –

9

のorg.hibernate.Sessionクラスのメソッドとの間の重要な違いは、&するsaveOrUpdateを保存するsaveOrUpdateがINSERTまたはUPDATEを行う一方saveは、INSERTクエリに新しい識別子と結果を​​生成します。

Saveメソッド

保存データベースにオブジェクトを格納します。つまり、識別子が存在しない場合はエントリを挿入し、そうでない場合はエラーをスローします。主キーがすでにテーブルに存在する場合は、挿入できません。

するsaveOrUpdate

このメソッド呼び出しは、操作に基づい(保存)またはupdate()。識別子が存在する場合は、updateメソッドを呼び出します。それ以外の場合は、saveメソッドが呼び出されます。するsaveOrUpdate()メソッドは、次の処理を行います

オブジェクトが、現在のセッションですでに永続的である場合、セッションに関連付けられている別のオブジェクトが同じ識別子を持っている場合、それは何も しない、場合は、発信者 に例外を投げますオブジェクト)(は識別子プロパティがない、保存()オブジェクト をオブジェクトの識別子が新たにインスタンス化されたオブジェクトに割り当てられた値を持っている場合は、保存対象

hereからもっと読みください。

2

save()は、永続インスタンスではなく、一時的なインスタンスを引数として取ることになっています。 javadocはあまり網羅的ではありませんが、永続インスタンスでsave()を呼び出すAFAIKは、エンティティに接続された一時インスタンスへの操作をカスケードする以外は効果がありません。このようなカスケードが構成されています。

通常、接続された永続エンティティ上でsave()またはsaveOrUpdate()を呼び出す理由はありません。これは、Hibernateがエンティティをダーティチェックし、変更を自動的に保持するためです。

0

したがって、私の知る限り、新しいレコードを作成する必要があります:はい、新しいレコードを作成する必要があります。しかし、この動作は永続オブジェクトではなく一時オブジェクトに対してのみです。

loadを呼び出してオブジェクトをロードする瞬間、このオブジェクトはセッション(永続状態)に関連付けられます。汚れたチェックのために、このオブジェクトは、とにかくフラッシュ中に更新されていました。

しかし、このオブジェクトが新しいオブジェクトだった場合、実際にはsave()またはsaveoOrUpdate()APIの呼び出しに違いがあります。

関連する問題