2009-06-03 3 views
6

HibernateのJavaDocは、永続的なインスタンスがすでにoである場合、Session.update(Object o)は例外を発生させると言います。Hibernateは例外をスローしていません。(私はそうすべきだと思います)

If there is a persistent instance with the same identifier, an exception is thrown.

ただし、次のコードは実行時に何も投げません。そして私はそれがすべきだと思います!

あなたが言うことができたよう
Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

session.save(email); 
session.update(email); 
session.update(email); 

tx.commit(); 

// didn't throw... Let's try again 

tx = session.beginTransaction(); 

session.update(email); 
session.update(email); 

tx.commit(); 
session.close(); 

// still nothing! :(

二回私は、複数のupdate()のことをしようが、それでもHibernateのは、私に簡単に取ります。

誰かがなぜ愚痴をしていますか?

EDIT:場合にのみemailと同じIDで、例えば、email2を別の同等のオブジェクトを投げるだろうと思われます。私はドキュメンテーションがちょっとうんざりしていたと思う。

+0

はい!ドキュメントは決してそれを明確に書いてはいけません、そして、私はこの質問に私を導きます! – GMsoF

答えて

8

Hibernateの更新はSQL言語でUPDATEされていません。 HibernateはSessionオブジェクト内の状態キャッシュを介して の自動的にのSQL UPDATEを処理します。

ただし、現在のセッションで読み込まれたエンティティのみです。このメソッドは、session.update(オブジェクト)は、オブジェクトを別の層から現在のセッションに接続して追跡し、可能であれば更新します。

あなたの場合、それは単なるNOOPです。あなたはHibernate referenceでupdateメソッドのセマンティクスについての詳細を読むことができ

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

int id = session.save(email); 
Email anotherEmail = new Email("", "", ""); 
anotherEmail.id = id; 

session.update(anotherEmail); // will throw 

:場合はsourlyスローされます。

+0

これは明確な例でより良い解決策です! – GMsoF

0

session.flush()を試すことができますか?その例外が発生するかどうかを確認します(コミットによってフラッシュモードによってデータがフラッシュされないことがあります)。

オブジェクトが現在のセッションの範囲外で更新された場合にのみ、例外がスローされるとは言えますが、並行クライアントによって言いましょう。

6

更新するインスタンスが同じであるため、エラーはありません。

セッションに異なる永続インスタンスが存在し、update()を実行しようとすると、エラーがスローされます。

+0

は毎回それを取得します –

+1

私はそれが 'DIFFERENT persistent instance'ではないと思います、それは' DIFFERENT detached instance'です。 – GMsoF

関連する問題