JAXSON 業務アプリケーションフレームワーク
トップ

インストール

ドキュメント
チュートリアル
開発ガイド
トランザクション管理
データベース接続
データベースアクセス
バリデーション
セキュリティ
エクセルファイル出力
JavaScriptリファレンス
API doc

ダウンロード
jaxson-2.1.zip

トランザクション管理

ServiceActionクラス
トランザクションは ServiceAction クラスで管理しています。
全てのアクションクラスはこの ServiceAction を継承して作成します。
基本的として 1リクエスト = 1トランザクション として、正常終了した場合はコミットされ、例外がスローされた場合はロールバックされます。
例外をスローせずにロールバックする場合は ServiceAction#setSeccess(boolean) にfalseを渡します。
複数のデータベース接続を使用する場合、 コミットもしくはロールバックは同様に全ての接続に対して行われます。
コミット、ロールバックは Action#execute() 終了後にサーブレットに呼び出される Action#postprocess() 内で行います。
アプリケーションでトランザクションを制御したい場合は ServiceAction#getConnector() もしくは ServiceAction#getConnector(String) で DatabaseConnectorオブジェクトを取得し、 これに対してコミット、ロールバックを行い、 Connectionに対して直接操作しないようにしてください。
getConnectorメソッドは引数なしのものはデフォルト接続を返し、 引数ありの場合は引数で接続名を指定します。
このトランザクション管理が正常に機能するために アクションクラスの実装時の注意点を以下に述べます。


Persisterクラス
そのアクションクラスで使用するデータベースアクセスクラスである Persisterはインスタンスフィールドに定義しておくと アクション実行前にそのPersisterで使用する接続がセットされて すぐにデータベース操作を行う事ができます。
public XXXAction extends ServiceAction {

    @Connector("somedatabese")  // デフォルト接続を使用する場合は不要
    @TableDEF("account")
    private BasicPersister persister;
    
    public Object execute() throws Exception {
       // 検索条件をセットしていないので全件検索を行う
       return persister.select(null);
    }
} 


他のアクションの実行
共通で使用するアクションを作成して他のアクションから実行することができます。
使用するアクションもインスタンスフィールドに持つようにします。
public class XXXAction extends ServiceAction {

    // OtherActionはServiceActionのサブクラス
    OtherAction otherAction;
    
    public Object execute() throws Exception {
        Object result = otherAction.execute();
        ...
    }
} 

アクション実行前に新規に作成したインスタンスをotherActionにセットし、 そのインスタンスに対して次のセットアップ処理を行います。 これによりアプリケーションは何も考えずに別のアクションを実行することができます。
アクションの実行は呼出し元のアクションと同一トランザクションで行われます。
注意する点としては 絶対にpostprocessメソッドを呼び出さない ということです。


パラメータのセット
トランザクションとは関係ありませんが、 クライアントから渡されるパラメータの取得方法を述べておきます。
(詳細はJAXSONのドキュメントを参照してください。)

アクションクラスのフィールドが @ContextParam 注釈されている場合、 そのフィールドにクライアントから渡されたパラメータをセットします。
セットされる値はそのフィールド名に等しいパラメータです。
値はそのフィールドの型に変換されますが、 変換できない場合はそのフィールド型のオブジェクトを生成して そのクラスのフィールドに対してパラメータをセットしようと試みます。
public class XXXAction extends ServiceAction {

    // accountNameというパラメータの値がセットされる
    @ContextParam
    String accountName;
    
    // FormBeanオブジェクトを生成してそのオブジェクトに対してパラメータをセットする
    @ContextParam
    FormBean formBean;
    ...
}

public class FormBean {

    // ここにパラメータをセットする
    @ContextParam
    String accountName;
    ...
}