3

私のJavaアプリケーションでは、異なる場所で同じオブジェクトを複数回使用しています。つまり、これらのオブジェクトを比較すると、equals メソッドは true を返します。ここで、1 つのオブジェクトを更新し、すべてのオブジェクトに同じ変更を加えたいと考えています。そのパターンがあるかどうか知っていますか?

私の具体的なユースケースは次のとおりです。JSF、JPA、およびCDIを使用しています。ユーザーは、切り離されたエンティティ EntityA を編集できる Web ページを使用しています。ページはセッションスコープです。EntityA には EntityB への 2 つの参照があります (これも切り離されています)。これらのオブジェクトは同じにすることができます。同じ参照ではありませんが、等しい場合があります。

@Entity
public class EntityA {
   @OneToOne()
   private EntityB entity1;
   @OneToOne();
   private EntityB entity2;
}

JSF ビューでは、選択リストからエンティティ 1 とエンティティ 2 を選択できます。これらの EntityB の詳細も表示され、ユーザーは entity1 と entity2 を個別に編集できます。ユーザーがエンティティ 1 とエンティティ 2 に同じ (等しい) エンティティ B を選択したことを除いて、すべて正常に動作します。次に、これらのオブジェクトへの参照のみが更新されます。もちろん、entity1 と entity2 は 2 つの異なる JPA エンティティであり、同じ参照ではありません。しかし、EntityB の切り離されたすべてのインスタンスに変更を配布したいと考えています。私のアプリケーションではこのような状況が何百回も発生するため、どのオブジェクトをどの状況で更新する必要があるかを気にしたくありません。自動的にそれを行う解決策が必要です。1 つのアイデアは、このセッションで使用するすべてのオブジェクトを特別なリストに保持し、リクエストが送信されて処理されるたびに、このマップを反復処理し、すべての等しいオブジェクトを変更することでした。しかし、彼の音は非常に汚いです。おそらく、すべての等しいオブジェクトを同じ参照にするためのJPA関数が組み込まれています。これが可能かどうかはわかりません。これに対する解決策はありますか?ありがとう。

4

2 に答える 2

1

ここで問題を少し抽象化します。1 つのオブジェクトを変更するために他の多くのオブジェクトを変更する必要がある場合は、変更するフィールドを別のオブジェクトに配置し、それらすべてのオブジェクトがそれを参照するようにすることを検討してください。

たとえば、次の場合:

class MyClass {
  String info;
  int id;
}

同じ「id」を持つ MyClass の 2 つのインスタンスは、「info」フィールドが変更されたときに両方とも更新する必要があり、これを使用します。

class myClass {
  myInfoClass info;
  int id
}

class myInfoClass {
  String value;
}

のすべてのインスタンスがmyClassの同じインスタンスに等しいとしますmyInfoClass。を変更myClass.info.valueすると、 のすべてのインスタンスが効果的に変更されます。これはmyClass、それらがすべて の同じインスタンスを保持しているためですmyInfoClass

構文が少し間違っていたら申し訳ありません。言語間を頻繁に移動します。

スイッチがドアをアクティブにする最近書いたゲームでこの手法を使用します。スイッチとドアの両方に、ブール値フィールドCircuitを保持するオブジェクトがあります。poweredドアの「isOpen()」メソッドは単純に を返しcircuit.powered、スイッチがアクティブになったときに を呼び出すだけswitch.circuit.powered = trueで、ドアは自動的に「開いている」と見なされます。以前は、ゲームのマップで同じ回路 ID を持つすべてのドアを検索し、poweredそれぞれのフィールドを変更していました。

于 2012-12-17T14:00:28.620 に答える
0

これは古典的なフォーム処理ロジックです

  • ユーザーが保存ボタンをクリックした場合、データベース内のデータを操作します
  • Web ページを作成するたびにデータをリロードする
  • Web セッションでデータをキャッシュしないでください
  • キャッシュが必要な場合は、永続化レイヤーで有効にします (例: 休止キャッシュ)
于 2012-12-17T14:00:20.993 に答える