S2JDBC

「外だしSQL」を手放す。

iterateで取得するときの続き。寝かせてみました。id:higayasuoさんから BasicSelectHandlerと自前のResultSetHandlerの組み合わせ。 といただきましたが、Commons.DBUtilsとほとんど同じ機能なのでS2JDBCの外だしSQLが使えません。外だしSQLでビルドアップ…

iterateで取得するとき

Javaで大量のデータをListなんかで取得しちゃうと件数分のオブジェクトを作成してしまうので困るんですが、J2JDBCだと1件毎に取得できるのでJVMに負担をかけずに処理できます。カラム名の取得を行いたい場合、BeanMapを使ってカラム名を動的に取得できるんで…

TxAttributeCustomizerでの特定例外をコミット処理にする。

TxAttributeCustomizerを設定した場合、例外はずべてコミット処理されるみたいです。 j2ee.requiredTx等のコンポーネントを使って設定した場合はコミットする・しないを明示的に設定できたけど、どうもTxAttributeCustomizerにはaddCommitRule()やaddRollbac…

actionCustomizerでTxAttributeCustomizerを設定すると

SAStrutsはバリデーションのメソッドをActionに書くん様になっているんだけど、actionCustomizerでTxAttributeCustomizerを設定するとバリデーションのメソッドにまでTxAttributeが当たってるみたい。 ログに出てる。 @Executeがあるメッソッドだけでいいん…

SQLファイルによる検索

SQLファイルは、クラスパス上にあるならどこにおいてもかまいませんが、 ルートパッケージ.sql.テーブル名 のパッケージに対応したディレクトリ配下に置くことを推奨します。 例えば、 employee テーブルに関するSQLファイルは、 examples/sql/employee ディ…

続・ActionとServiceの責務

ActionとServiceの責務の続き。SAStrutsのサンプル(employee)を書くときに、最初は、ActionとServiceは分けていたんです。で、どうだったかって言うと、ActionはS2BeanUtilsを呼び出すコードだけがあり、Serviceには、S2JDBCを呼び出すコードだけしかない。 …

jdbcManager.deleteBatch(entities).execute()での楽観的排他制御ができない。

AbstractAutoBatchUpdate#executeInternal()のなかで実行結果の件数を元にvalidateRows()で更新件数が0の時は楽観的排他ロックのエラーとしてるんだけど、OracleのjdbcではどうもexecuteBatchの戻り値としてSUCCESS_NO_INFO(-2)が返ってきてて、件数が正しく…

ActionとServiceの責務

SAStruts+S2JDBCを使った開発では ServiceはEnthity単位に ロジックはActionに記述する ユースケース内のコードシェアは抽象クラスで 広範囲のコードシェアはLogicなりユーティリティなクラスで という感じみたいですが、ちょっと悩みどころが。よく1つのテ…

発行されるSQLを取得する。

S2JDBCで発行されるSQLを取得できるようなことをどこかでみた覚えがあるので、思い出して探す。 結果は後ほど。 2008/07/23 09:48 追記 みっけ。 SqlLogRegistry registry = SqlLogRegistryLocator.getInstance(); SqlLog sqlLog = registry.getLast(); S2JD…

S2JDBCのWhere句

S2JDBCでAutoSelectかSimpleWhereを使ってWhere句を設定するんだけど演算の順位付け(?)を設定する方法が判らない。例えば複合キー(id1、id2)で特定のキー(id1=1、id2=1)以外の全てを取得したい場合 (例が悪いけど・・・) SimpleWhere w1 = new SimpleWhe…

Entityの@Idプロパティだけ抜き出せないのかなぁ?

S2JDBCのupdateは更新対象のレコードがない場合、SOptimisticLockExceptionが返ってきます。 これでもいいんでしょうが、できれば「対象がありません。」みたいな感じがうれしいので、updateの前に更新対象のEntityが存在するかしないか調べたいとお思います…

S2AbstractService

Seasar2.4.26からServiceのひな形となるS2AbstractServiceが用意されている。アプリケーションはS2AbstractServiceのサブクラスを作って各やりたいことを追加して利用するようになってるんだけど、Serviceを実装してS2TestCaseで動かしてみると、S2AbstractS…

S2JDBCでの複合キー

Hibernateは複合キーを使う場合何かと面倒だったので複合キーにはすごい抵抗が合ったんだけど、S2JDBCの複合キーはすっごい簡単。Entityを以下の様すると、 @Entity public class Hoge { @Id public Integer id1; @Id public Integer id2; @Id public Intege…

S2JDBCの1対多の結合はなんでinnerJoinなんやろ?

S2JDBCのTutorialでDepartmentのエンティティにOneToManyでEmployeeのエンティティが指定されています。 @Entity public class Department { ... @OneToMany(mappedBy = "department") public List employeeList; } というEntityに対して List results = jdb…

SQLクエリのカラム名をそのまま取得するには

S2JDBCのselectBySqlを使ってCSVファイルの出力なんかを大量に作るんだけど、件数の上限がわかんないのでResultSetHandlerを独自に実装したいんだけど、ググっても2004年頃の話しか出てこない。 わざわざResultSetHandlerを独自に実装するのはSQL文の項目名…

S2JDBCのBeanMap

Mapインターフェースなんだけど、実装はHashMap。なのでSQLで記述したカラム順序とBeanMapから取得できる項目の順序は一致しない。大概は問題では無いんだけど、ダウンロードデータをめんどくさいからそのまま出力したい場合、カラム順とCSVの並びを一致させ…

S2JDBCでの関連

S2JDBCの関連はHibernateとかと違って、対象のキーもエンティティに指定する必要があります。 その辺りの話はここから。OneToOneやManyToOneの場合、先に関連付けする方を登録しないと、関連付けされる方に設定する識別子が判らない気がするんだけど、どうな…