0

この質問の続き:

Apache Cayenne: ユーザー定義テーブル: 例?

設計の一環として、実行時にデータベース スキーマを変更する操作を許可するつもりです。上記の質問で説明したように、Cayenne はこれをサポートしているようです。

ファイル システムを使用せずに、新しいプロジェクト定義を ServerRuntime に提供する方法に興味がありました。

ソースを見ると、次の 2 つのオプションがあるように見えます。

(1) カスタム クラスローダーを実装し、それをスレッド ローカル クラス ローダーとして設定し、Cayenne が ClassLoaderResourceLocator を使用してそれを見つけられるようにします。

(2) カスタム ResourceLocator を実装し、インジェクションを使用してバインドします。

(1) を行う方法は明らかですが、ClassLoaderResourceLocator の動作に依存しないため、(2) の方が少しすっきりしています。

(2)は合理的ですか、これをどのようにコーディングしますか?

4

1 に答える 1

1

動的プロジェクト定義がまだ XML であると仮定すると、カスタム ResourceLocator バインディングは非常に単純であり、おそらく最適な方法です。したがって、独自の XyzResourceLocator がある場合は、次のようにするだけです。

// using lambda for the Module interface (assumes java 8)
ServerRuntime r = new ServerRuntime(
    "somelocation", 
     binder -> binder.bind(ResourceLocator.class)
                     .to(XyzResourceLocator.class));

XyzResourceLocator の実装方法は、動的に生成されたプロジェクト定義が存在する場所によって異なります。

また、ソースコードを見ると、小さな注意点があります。ResourceLocator は (誤って IMO) 別のコンテキストで使用され、内部の Cayenne XML 記述子の一部をロードします。したがって、独自のロケーターを実装する場合は、次のようなチェックを行う必要がある場合があります。

if(name.endsWith("types.xml")) { .. revert to ClassLoaderResourceLocator ..}
else { .. use your own algorithm .. }

これら 2 つの使用法を Cayenne で最終的に分離する必要があります。

于 2015-06-17T18:05:38.847 に答える