2

私は、他のエンティティで構成されるエンティティ オブジェクトを含む、ある程度正規化されたデータベースを持っています。ルート エンティティをそれ自体で公開し、セッション スコープとアプリケーション スコープの両方で Java Web アプリケーションのコレクションとして公開します。ルート Entity オブジェクトを、スレッドセーフで Web アプリ環境で公開できる不変オブジェクトに変換する最善の方法は何だろうと思います。私が見つけた方法は次のとおりです。

1) ビルダーを使用して、DAO でエンティティを不変オブジェクトに変換します。これは最もプログラミングのように思えます。つまり、不変オブジェクトを設定するためにエンティティ全体を反復処理する必要がありますが、マルチスレッド環境では最も安全であるようにも見えます。

2) get メソッドで構成される読み取り専用インターフェイスにエンティティをキャストするファクトリ/ビルダーを使用します。この質問については、こちらを参照してください。これはクールに思えますが、実際に試したことはありません。フィールドが最終的なものではなく、オブジェクトがある程度変更可能であるため、完全にスレッドセーフではないようです。唯一のバージョン。

3) Hibernate の @Immutable アノテーションのようなベンダー固有のものを使用します。これは最初は良さそうに思えますが、どのコレクションも不変の値を返していないことを確認すると、上記のオプション 1 のようになり始めます。ここでは、すべての値を繰り返し処理し、それらを不変バージョン。また、@Immutable エンティティが使用され、Web アプリケーションで公開された例は見つかりませんでした。スレッドセーフですか?

エンティティ関係の例 (ネストされた性質を示すためだけに、不完全で機能しません):

class A {
    @Id
    private long id;

    @OneToOne
    @JoinColumn
    private B b;
}

class B {

    @Id
    private long id

    private String something;

    @OneToMany
    @JoinTable
    private List<C> cs;
}

class C {
    @Id
    private long id;

    @Column
    private String name;

    @Column
    private String otherName;
}

助けてくれてありがとう。

4

1 に答える 1

2

私の意見のオプションについて:

プライベートのデフォルトコンストラクターを作成します(休止状態で必要なデフォルトコンストラクター)。すべてのフィールドの完全なコンストラクターを作成し、それらをプライベートとして定義します。

于 2012-08-14T14:36:04.133 に答える