コンテンツにスキップ

マッピングトランザクション

多くのフレームワークは、jvmguardでトランザクションに変換できる重要なクラスやエントリポイントを指定するためにアノテーションを使用しています。「マッピング」トランザクションタイプを使用すると、この作業をjvmguardに任せることができます。

メソッドアノテーションとクラスアノテーション

Section titled “メソッドアノテーションとクラスアノテーション”

Mappedトランザクション定義は、対象のアノテーションの完全修飾クラス名を取ります。アノテーションはクラスまたはメソッドのいずれかに使用できます。設定を進める前に、選択したアノテーションがどのターゲットに使用されているかをjvmguardに伝える必要があります。

アノテーション付きメソッドの場合、各メソッド呼び出しがjvmguardでトランザクションになります。クラスのアノテーションは、publicインスタンスメソッドへのすべての呼び出しに対してトランザクションを作成します。

2番目の選択は、派生クラスも考慮するかどうかです。メソッドの場合、オーバーライドされたメソッドの時間をキャプチャすることが重要になることがあります。例えば、フレームワークが実装プロキシクラスを作成し、アノテーション付きメソッドをオーバーライドしてデータベーストランザクションを追加する場合、アノテーション付きメソッドだけでなく、プロキシクラスのメソッドをインターセプトしたいでしょう。

アノテーション付きクラスの場合、「メソッド選択」オプションは、トランザクションを生成するためにどのメソッドが選択されるかを決定します。

  • 実装またはオーバーライドするpublicメソッド: アノテーションが、対象のすべてのオペレーションをそのメソッドですでに定義しているインターフェースに配置されている場合は、このオプションを選択する必要があります。
  • 実装クラスまたは派生クラスのすべてのpublicメソッド: 派生クラスに、アノテーション付きクラスのメソッドを実装またはオーバーライドしない独自の対象メソッドがある場合は、このオプションを使用してすべてのpublicメソッドからトランザクションを作成します。

派生クラスのpublicメソッドをインターセプトする設定でクラスにアノテーションを使用する場合、トランザクション命名でどのクラス名を使用すべきかという問題が残ります。

デフォルトでは、「クラス名」タイプの命名要素は、インターセプトされたメソッドが定義されているクラスの名前を追加します。代わりにアノテーション付きスーパークラスの名前を追加したい場合は、ウィザードの「アノテーション」ステップで「フィルターと命名にアノテーション付きクラス名を使用する」チェックボックスを選択します。

逆に、メソッドが呼び出された実際のインスタンスのクラス名を追加したい場合は、代わりに「インスタンスクラス名」命名要素を使用します。

さらに具体的には、「インスタンス名」命名要素は、トランザクションメソッドが呼び出されたオブジェクトに対するtoString()呼び出しを追加します。

この命名要素は、このオブジェクトにgetterチェーンを適用し、代わりに結果に対するtoString()呼び出しをトランザクション名に追加することもできます。例えば、インスタンスクラスに目的のテキストを返すgetVerbose()メソッドがある場合、getterチェーンをgetVerbose()に設定します。次のように、publicフィールドアクセスとパラメータなしのpublicメソッド呼び出しを混在させることができます。

getParent().descriptor.getVerbose()

getClass()メソッドを使用してクラス名を追加する場合、「クラス名」と「インスタンスクラス名」命名要素で利用できる省略および単純クラス名モードをシミュレートするために、jvmguardが提供する2つの特別なフィールドがあります。

  • getClass().simpleNameを使用すると、パッケージなしのクラス名が追加されます。例えば、com.mycorp.MyClassはMyClassになります。
  • getClass().abbrevNameを使用すると、省略されたパッケージ名が追加されます。例えば、com.mycorp.MyClassはc.m.MyClassになります。

「インスタンス名」命名要素は、常に実際のメソッド呼び出しを伴うため、「インスタンスクラス名」または「クラス名」命名要素よりもはるかに高いオーバーヘッドを生成することに注意してください。