2008年10月7日火曜日

Cayenneでデフォルトトランザクションを実行させない方法(つづき)

前回のブログではCayenneにデフォルトトランザクションを実行させない方法を記載した。
がしかしこれではちょっとつかいずらいのではと思ったので以下のようなクラスを作成してみました。

import org.apache.cayenne.access.Transaction;

public abstract class NoTransactionSqlExecutioner {

protected Object[] prm;

public NoTransactionSqlExecutioner() {

}

public NoTransactionSqlExecutioner(Object... prm) {
this.prm = prm;
}

public Object getPrm(int index) {

if (prm == null)
throw new RuntimeException("paramter not setting");

if (prm.length < index)
throw new RuntimeException("paramter out bound ");

return prm[index];

}

public Object exec(){

Transaction tx = new NoTransaction();
try {

Transaction.bindThreadTransaction(tx);
return execDetail();

}
finally {

Transaction.bindThreadTransaction(null);
try {
tx.commit();
} catch (Exception e) {
}

}

}

public abstract Object execDetail();

}


これを利用して以下のようします。
ちょっとはすっきりしたかな。JAVAでインナークラス内でローカル変数つかえればもっと楽になるんだけど。finalで宣言するのも面倒だし...。

public List sampleMethod(String parameter1) {

List list = (List)new NoTransactionSqlExecutioner(parameter1) {

public Object execDetail() {

Expression expression = ExpressionFactory.matchExp(SampleTable.COL1_TYPE_PROPERTY, getPrm(0));
SelectQuery query = new SelectQuery(Tag.class, expression);
return (List)getDataContext().performQuery(query);

}

}.exec();

return list;

}

以上

0 件のコメント:

コメントを投稿