がしかしこれではちょっとつかいずらいのではと思ったので以下のようなクラスを作成してみました。
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) {
Listlist = (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 件のコメント:
コメントを投稿