2

これに似たメソッドを持つ一連の DOA を考えてみましょう

public void addObject(Long sessionId, Long clientId, Dom obj){...}

現在、すべてのドメイン pojo ( Dom) にはsessionIdプロパティがあり、ドメイン オブジェクトのすべての挿入、更新、または削除に対して asessionIdを渡す必要があるsetSessionId(Long sessionId)ため、誰が何を行うかを知ることができます。しかし、これは私たちのすべてのデータアクセスを横断しているようであり、AOP はaまたはアドバイスsessionIdのいずれかに挿入するための優れたツールになると思います。これは実際に実現可能ですか?DAO はほとんどが Hibernate ベースであり、Spring がいくつかあります。@Before(JoinPoint)@Around(ProceedingJoinPoint)StoredProcedure

4

3 に答える 3

1

あなたの sessionId パラメータは、監査の側面に属しているようです。Hibernate では、この監査の側面は通常、 org.hibernate.Interceptorの実装で実装されます。

エンティティとクエリのライフサイクル イベントに対応する多くのメソッドを実装できます。実装では、現在の sessionId に簡単にアクセスできます (ThreadLocal 変数を使用できます)。クリアでクリーン、高速 ;-)

これは、特にライフサイクル イベントの Hibernate からコールバックを取得するため、AOP で自分で行うよりもおそらく簡単です。

于 2009-10-08T10:13:49.990 に答える
1

なぜこれができなかったのかわかりません。実際に過去に似たような (もう少し複雑な) ことをしたことがあり、すべてのクラスを相互リファクタリングしなくて済みました。

親/上位クラスに public void addObject(Long sessionId, Long clientId, Dom obj){...} を入れることを考えたことはありますか? このメソッドは、各実装で委任できます..

于 2009-10-06T20:36:25.780 に答える
1

DAO レイヤーの周りのインターセプターは、推移的な永続性、つまり関連付けられたエンティティにカスケードする休止状態の操作 (保存、削除など) を説明するのに問題があります。Hibernate セッション インターセプターは可能です。

いずれにせよ、インターセプターが何らかの方法で現在のセッション ID を発見できる場合、これはどちらの方法でも可能です。

于 2009-10-05T21:49:00.557 に答える