アノテーションでマークされたDAOメソッドが実行されるたびに、Springを使用しTransactionInterceptorてデータベースパーティション情報を設定しています。これは、クエリを異なるデータベース パーティションにルーティングできるようにするために必要です。ThreadLocal@Transactional
これは、ほとんどの DAO メソッドでうまく機能します。
// this causes the invoke method to set a thread-local with the host name of
// the database server the partition is on
@Transactional
public int deleteAll() throws LocalDataException {
問題は、DAO 内で DAOプロキシオブジェクト自体を参照する必要がある場合です。通常、proxy-dao で呼び出し元を渡す必要があります。
public Pager<Foo, Long> getPager(FooDao proxyDao) {
これは、明らかにグロスなコードでは次のようになります。
fooDao.getPager(fooDao);
問題は、FooDao の内部にいる場合、必要なプロキシ DAO でthisはないことです。
Bean がプロキシ ラッパーを持っていることを検出するためのより良いメカニズムはありますか? Spring AOPUtilsを見てきましたが、オブジェクトのプロキシを見つける方法がわかりません。isAopProxy(...)たとえば、私はしたくありません。Spring AOPのドキュメントも読みましたが、回避したい独自の AOP ネイティブ コードを実装しない限り、解決策が見つかりません。
ApplicationContextAwareユーティリティー Bean とメソッドを使用して DAO 自体に注入できるのではないかと思いますがsetProxyDao(...)、それもハックのようです。Bean 自体からプロキシを利用できるようにプロキシを検出する方法はありますか? 助けてくれてありがとう。