25

通常、私は save() メソッドがオブジェクトの新しい識別子を生成し、 INSERTを起動して保存するだけで更新しないことについて読んでいましたが、saveOrUpdate() メソッドはレコードを挿入または更新する場合があります。

しかし、私の経験によると、ここではサンプルコードでよりよく説明できます。

クラス Aがあり、テーブル Aからレコードを見つけたとします。

A a = getHibernateTemplate.findById(7);

これで、永続オブジェクトを取得し、

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

今、私は発砲しています。

getHibernateTemplate.save(a);

したがって、既存のレコードを更新するだけですが、私の知る限り、新しいレコードを作成する必要があります

私は特定の事柄について間違っているかもしれませんが、誰かがこれについて明確にすることができますか?

4

4 に答える 4

28

保存

データベースに保存methodobjectます。最初に生成された識別子を割り当てて、指定された一時インスタンスを永続化します。作成されたエンティティreturnsIDです。

一方、

SaveOrUpdate()

save()またはupdate()識別子に基づいてコールが存在するかどうか。たとえば、識別子が存在する場合update()は呼び出されるか、そうでsave()ない場合は呼び出されます。

persist()、merge()、saveOrUpdateCopy() など、他にもたくさんあります。ほとんどすべてが同じで、機能と使いやすさがわずかに異なります。

詳細については、これを読むことができます。 Hibernate のさまざまな保存方法の違いは何ですか?

于 2013-07-12T10:12:53.740 に答える
9

org.hibernate.Session クラス メソッドの save と saveOrUpdate の重要な違いは、save新しい識別子を生成し、結果として INSERT クエリになるのに対し、saveOrUpdate は INSERT または UPDATE を実行することです。

保存

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

保存または更新

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

オブジェクトが現在のセッションですでに永続的である場合、何もしません セッションに関連付けられた別のオブジェクトが同じ識別子を持っている場合は、呼び出し元に例外をスローします オブジェクトに識別子プロパティがない場合は、オブジェクトを save() オブジェクトの識別子が持っている場合新しくインスタンス化されたオブジェクトに割り当てられた値、 save() オブジェクト

詳しくはこちらから。

于 2013-07-12T10:09:14.493 に答える
3

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

Hibernate はエンティティをダーティチェックし、変更を自動的に永続化するため、通常、アタッチされた永続エンティティに対してsave()orを呼び出す理由はないことに注意してください。saveOrUpdate()

于 2013-07-12T10:12:27.487 に答える
0

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

load を呼び出してオブジェクトをロードした時点で、このオブジェクトはセッション (永続状態) に関連付けられます。また、ダーティ チェックが原因で、このオブジェクトはいずれにせよフラッシュ中に更新されます。

しかし、このオブジェクトが新しいオブジェクトである場合、実際には save() または saveoOrUpdate() api の呼び出しに違いがあったでしょう。

于 2013-07-12T10:14:45.450 に答える