1

の設計に問題がありVetoableChangeListenerます。VetoableChangeListenerモデル クラスのプロパティの変更をリッスンするインターフェイスを実装します。

vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException

…変更を DB に保存しようとしましたが、失敗する可能性があります (SQLExceptionたとえば、によって)。失敗した場合は、 をスローPropertyVetoExceptionしてモデルの変更を元に戻します。

モデルはVetoableChangeSupport(JDK クラス) に委譲されており、それを受け取るとそれをキャッチし、/を交換して (後で例外を再スローする) PropertyVetoExceptionALL に戻すことを通知し、イベントが再びクラスに来るようにします。 DBに再度保存するなど...VetoableChangeListeneroldValuenewValue

誰も をスローしないまでモデルが変更されないという回避策があります。そのPropertyVetoExceptionため、VetoableChangeListener最初に、データベースに保存するデータがモデルのデータと等しくないかどうかを確認します。単に変更を無視します。

別のより良い回避策はありますか?

4

3 に答える 3

1

あなたの「回避策」は実際には回避策ではありませんが、実際には適切な解決策のように思えます。永続化されたバージョンを「変更」しようとする前に、オブジェクトの現在の状態に実際に変更があることを確認します。これは、はるかに効率的でもあります (データベースへのアクセスは高価です)。

于 2008-10-26T14:45:58.960 に答える
0

To:timyates

それはまさに私がしていることです、私はイベントを受け取り、DB を更新しようとしましたが、失敗しました。変更を拒否する例外をスローして、モデルが更新されないようにしましたが、問題は、VetoableChangeSupport が私自身の拒否を通知することです。質問で説明している回避策を実行しないと、bucle に入る

于 2008-09-23T18:06:04.413 に答える
0

モデルを変更した後ではなく、変更する前に Vetoable の変更を確認する必要があります...

つまり、問題がある場合、モデルは変更されません。変更が間違っていた場合、モデルは元に戻されません。

于 2008-09-23T12:36:47.870 に答える