23:56:54)追加された行はこの色です。削除された行はこの色です。http://ml.seasar.org/archives/seasar-user/2007-April/009012.htmlBindingアノテーションを使用する方法もあります。[#y3fc4970]S2Daoは以下のDBに対応しています。JOIN構文をサポートしているDBでしたら動作すると思います。DaoにはBEANアノテーションを、JavaBeans(Entity)にはTABLEアノテーションを書きましょう。DaoにはS2DaoInterceptorを適用する必要があります。AbstractなDaoを使うことも可能ですが、何らかのDaoインタフェースをimplementsしている必要があります。dao.diconなど同梱のdiconがupdateされている可能性があります。リリースノートを確認しましょう。[#eef011b7]S2Daoとしてはトランザクション制御に関与しません。S2が持つトランザクション制御機能を利用することを想定しています。多いパターンは、Daoを呼び出す側のコンポーネントへj2ee.requiredTxアスペクトをかけることになるでしょう。[#m94ddb63]次のものがあります。19:48:55)~~''Question''~''Question''~S2Daoの開発の中で、updateBatchを投げる際、更新したくない列を指定~したいのですが、方法がわかりません。~~''Answer''~''Answer''~NO_PERSISTENT_PROPSアノテーションを使用すると更新対象に含まれなくなります。~~http://www.seasar.org/s2dao.html#NoPersistentPropsAnnotation~を参照されると良いと思います。19:46:22)~~''Question''~''Question''~S2DAOでconnectionPoolを利用しているのですが、コネクションのプーリングが~行なわれていないような動作をしているので、設定に漏れがあるのではないかと~思い、何かアドバイスを頂ければとメールさせて頂きました。~~実行ログを見ると、最初に1件のみ~[物理的なコネクションを取得しました]を表示して、以降はDBにアクセスする~と[論理的なコネクションを取得しました]と出力され、1つ物理コネクションを~使い回しているようなログが出力されています。~~この時に、Oracleのv$sessionを見ると論理的なコネクションの数だけセッショ~ンが張られています。~~しばらくDBへのアクセスを行なわずにいるとログには[論理的なコネクション~を取得しました]の表示がOracleに張られていたセッションの数だけ表示されま~す。constructorにありますね。diconファイルから構築しているので、結局のとこ~ろVM空間上に複数のコンポーネントセットが存在することになります。~~ということは、DataSourceもConnectionPoolも複数あるので、ログにあるよう~な動きになります。~~S2の挙動というよりかは、DIの適用パターンにあわせて設計・動きを少し変更~されたほうがよろしいかと思います。constructorを削除する。スと実装クラスに分離したほうが良いです。19:42:46)~~''Question''~''Question''~~S2DAO、S2JDBC等でSQLを発行する際にコンパイル済みのSQLを発行するのか、~毎SQLを生成して発行するのか、どちらなのでしょう?サンプルのログをみてい~ると毎回生成しているように思えるのですが。~~''Answer''~''Answer''~~PreparedStatementに格納してあるプリコンパイルされたSQLを発行しています。~~ログではき出されているSQLは、Statementに渡される(発行する)SQLを~そのまま表示している訳ではなく、ログにはき出すためにS2が、パラメータが~埋め込まれたSQLをせっせと作っています。~~org.seasar.extension.jdbc.impl.BasicHandlerクラスの~getCompleteSqlメソッドが参考になると思います。19:40:26)~~''Question''~''Question''~~S2DaoでJDK1.4.2_08だと動くコードがJDK1.4.2_10にして~Daoのメソッドを呼ぶとClassCastExceptionでこけてしまうコードがあります。~~DaoのメソッドはBigDecimalを返すメソッドで引数4つを取ります。test.TestDatDao$$EnhancedByS2AOP$$18622f3.sumTest(TestDatDao$$EnhancedByS2AOP$$18622f3.java)~となっております。~SQLを組み立てる時にこけている様な感じです。~DAOのバージョンはs2-dao-1.0.28.jarでPostgreSQL8.0.3を使っております。1.4.2_10にはJISAutoDetectのバグがあります。~http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25802&forum=12~~FIXされるまで1.4.2_10より前のバージョンを使われることをオススメします。19:33:05)~~''Question''~~S2Daoのプライマリーキーの処理について伺います。~~S2Daoを使ってDB2へのアクセスを勉強しております。~テーブルにプライマリーキーが設定していないと、S2Daoが~「・・にプライマリーキーが見付りません」の例外を投げてきます。~当然テーブルに直接プライマリーキーが設定していれば問題が~ありませんが、既存のテーブルに明示的に主キーではなく、~Index(索引)の形で主キーを指定されていることです。~~この場合はS2Daoをどのようにすれば~「・・にプライマリーキーが見付りません」の例外を回避できるのでしょうか。~~''Answer''~UPDATEやDELETEなどの自動生成を行わなければ、プライマリキー~がなくても問題ありません。~したがって、UPDATEやDELETEをsqlファイルやsqlコメントで行えば~例外を回避できると思います。19:33:05)''Question''S2Daoのプライマリーキーの処理について伺います。S2Daoを使ってDB2へのアクセスを勉強しております。テーブルにプライマリーキーが設定していないと、S2Daoが「・・にプライマリーキーが見付りません」の例外を投げてきます。テーブルに直接プライマリーキーが設定していれば問題がありませんが、既存のテーブルに明示的に主キーではなく、Index(索引)の形で主キーを指定されていることです。この場合はS2Daoをどのようにすれば「・・にプライマリーキーが見付りません」の例外を回避できるのでしょうか。''Answer''UPDATEやDELETEなどの自動生成を行わなければ、プライマリキーがなくても問題ありません。これは、UPDATEやDELETE文のWHERE句にPKを含むよう自動生成するためです。したがって、UPDATEやDELETEをsqlファイルやsqlコメントで行えば例外を回避できると思います。DAOがUPDATEやDELETEメソッドを持たない場合は、何か対応する必要はありません。テーブルにはPKを付けることを推奨します。19:30:14)~~''Question''~''Question''~j2ee.diconでの設定を利用すれば自動的に1個のコネクションを得られます。~複数DBとのコネクションを取得するにはどうすればよいのでしょうか。SelectableDataSourceProxyを使う方法もあります。19:26:23)~~''Question''~''Question''~複雑なSQLを処理する場合の実装方法について教え頂けませんでしょうか?~~''Answer''~''Answer''~引数の値をSQL文に文字列として直接埋め込む。[[ドキュメント:http://s2dao.seasar.org/ja/s2dao.html]]の~「埋め込み変数コメント」を参照。ように「?」を含む演算子があります。'hoge';~~この演算子を使用したSQLを発行しようとすると、「?」がバインド変数とみなされ~て、~java.sql.SQLExceptionが発生してしまいます。'hoge';~となっています。~~org.seasar.framework.util.PreparedStatementUtilで~java.sql.PreparedStatementを使用している以上、~s2daoでPostgresSQLの幾何データ演算子を使用することはできないのでしょうか?~~ちなみに、単独でjava.sql.Statementを使用して同じSQLを発行すると、~正常に問い合わせが行われました。~~何かよい方法があれば、教えてください。~よろしくお願い致します。OPERATOR文を使用して、新しく作成したOPERATORの中でpath_interを~呼び出すことで、無事解決することができました。動的に、外部ファイルの内容に置き換えたい。-----------------------------~なぜ上記のような質問をしたかと言いますと、現在「S2DAOを使用しDBにア~クセスするサーバ常駐プログラム」を開発しており、設定ファイルなどを使用~して動的に接続先DBを変更できる仕様を検討しているためです。~~以下URLに記載されているように、DAOクラスにてprivate変数にDataSource~を定義して、コネクション取得時にURLなどの情報を変更することもできそ~うですが、なるべくDAO実装クラスを書きたくありません。S2Daoでもなんでも...~~ただし、この方法でS2Daoの接続先を変更する場合には、複数の接続先はDBMS~も含めてほぼ?コンパチである必要があると思います。driverClassまで置き換えることが前提となってい~るようですのでこの方法ではS2Daoは誤動作する可能性があると思います。ConnectionPoolのフィールドを1つだけ持つJavaBeanで~充分です。~~やり方としてはエレガントではないかもしれませんがいまのところ機能してい~ます。</component>~みたいなかんじでできますよ。~abc.propertiesは、この例だとCLASSPATHに通されているディレクトリの~ルートに置いてください。~~動的にっていっているところが意図するところと合ってないかもしれませんが。/*dto.aaa*/('aaa')というふうにコメントより後ろの括弧が必要。18:37:25)~~''Question''~S2DAOでcount(*)のSQLに条件を入れて実行すると必ず件数が0件と返ってきます。~条件なしに実行すると件数は取得できます。~~書き方が誤っているのでしょうか。~条件があっても件数を取得できる方法を教えていただけますでしょうか。~~よろしくお願いします。-------------------------------------------------------~''Answer''~SQL自体は正しかったのですが、SQLコメントにyear,monthなど予約語で使われている~ものを使用すると条件が無視されていることがわかりました。~~なのでyear,monthのSQLコメントをintYear,intMonthに直して実行すると件数の取得ができました。APIから知る方法が無いため、無理。java.sql.Statement#executeBatch()を使用しているのであれば、戻り値のint[]に各コマンドの実行結果が反映されているはずですよね?現実的には、1つのコマンドでも失敗すれば、全てのコマンドが失敗したような状態になってしまった記憶があります。JDBCドライバー次第ってことですね。18:36:01)~~''Question''~S2daoを使ってDBにアクセスする際に、~statementのqueryTimeoutを設定することはできないのでしょうか?~~SQLを投げて処理が重くてかえってこない場合にタイムアウト~にしたいのですが。~~DBはオラクルを使っています。class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>のところを置き換えればできると思います。~~Daoごとに、queryTimeoutの値を変えたいのでしたら、~http://groovetube.org/index.php?itemid=183&catid=6~こちらのページを参考にして、queryTimeoutごとにdao.diconを~作ればできなくはないと思います。~~あるメソッドだけ、queryTimeoutの値を変えたい場合は申し訳ないのですが、~今はできないと思います。http://ml.seasar.org/archives/seasar-user/2006-August/006205.html//''Question''SQLのパラメータ?の部分に、以下のような文字列が入ってしまいます。18:34:17)~~''Question''~トランザクションの管理について教えて下さい~~S2DAOを使った場合、コミットはどのタイミングで実行されるのでしょうか?~~現在、requiredTxを指定して更新処理を行なう簡単なサンプルを作成して動作さ~せてみているのですが、複数件を同一トランザクションで更新したい所で1件毎~にコミットが実行されてしまう為に処理途中でエラーが発生してもロールバック~する事が出来ません。18:33:19)~~''Question''~現在、S2DAOで稼動中のWebがあるのですが、さらに2つのDBインスタンス(実際に~はサーバも違えば、かたやORALCE、かたやSQLサーバ)を参照するような要件が挙~がってきました。~さて、いろいろ調べているのですがどうも実装の仕方がわかりません。どのようにdiconを書けばよいのでしょうか?~~~''Answer''~こちらのページが参考になると思います。18:32:20)~~''Question''~S2DAOを使用したアプリでRDB(Derby)のデフォルトのアイソレーショ~ンレベルを変更する必要が生じました。~~現在DataSourceImplをコピーし、そのgetConnectionにコードを追~加、setTransactionIsolation()を使用して変更を行っています。~(DataSourceImplがfinalになっているためコピーしました。)~~その後、j2ee.diconのdatasourceコンポーネントのクラスをこちら~に差し替えアプリを実行しています。~~一応これで上手く動いているように見えるのですが、~1.このやり方でいいのか~2.他にもっと上手い方法があるのか~などご存知でしたらご教示ください。~~~''Answer''~DataSourceImplのgetConnectionへaspectを仕掛け、そのaspectで~setTransactionIsolationしてあげれば、「DataSourceImplをコピーして変更」しなくて済みますよ。しますが、詳しくないのでパスさせてください。~~~''参考投稿''~http://ml.seasar.org/archives/seasar-user/2006-March/005271.html~http://ml.seasar.org/archives/seasar-user/2006-March/005272.html~排他制御には、TimestampよりもVersionNoの方が良い。レコード更新時の時間を持ちたいのならば、トリガーを使うのが良いのでは。[#t6a127bb]はい、扱えます。JavaBeansのプロパティをbyte[]型にしておくと、S2DaoはPreparedStatementに対してsetBinaryStream、ResultSetに対してgetBytesを呼び出すようになります。18:31:35)~~''Question''~データベースはPostgreSQL8.1を使用しております。limist);~~としたところ、~「[ESSR0068]テーブル(t_character_mst)のカラム(offset)が見つかりません」~とエラーとなりました。limitが正しく~出力されている事を確認しました。ページング機能が実装されています。その機能を用いればoffset、~limitを特に意識する事無く実現出来るようになっています。sqlにoffset、limitが~ないデータベースでも簡単にページング機能が実現出来るところが素敵です。~~詳細はS2Daoのホームページにマニュアルがありますのでそちらで。ThinドライバではなくOCIドライバを使うと言った解決方法があるようです。18:29:45)~~''Question''~S2DaoとMySQLの組み合わせでDBアクセスのテストを行っています。~IDアノテーションを使用して、IDの取得を試みていますがうまく~取得できません。~~テスト状況はWikiと同様でinsertを行っているクラスにはj2ee.requiredTx~を設定しています。~~~''Answer''~Daoを定義するdiconファイル内でS2DaoIntesepterをアスペクト~指定したあとに書いたトランザクションは無視されてしまうようです。~※開始されていたトランザクションは呼び出しクラスにかけていたものでした。<aspect>j2ee.requiredTx</aspect>←無視される※バージョンにもよると思いますので、追加情報をお持ちの方にコメント頂きたいです。