2005/07/17 しつもんこーなーを凍結します。
それまでは ML をご利用ください。

しつもんこーなー

ここのページの意味

  • seasarを使用する上での疑問、質問に答えるコーナー。
    Wikiに質問コーナーを開設しました。
    Seasarを使っていて困ったことや質問を募集しています。
    過去に困ったこととその解決策も募集しています。
    チームで使っていて初心者がよく躓くような内容ほしいです。
    将来的には編集してFAQ作成を目指してます。ご協力お願いします。
    回答の内容はリンクでも可です。

つまづいたことや困ったこと

S2DaoのDB接続先の切り替えについて

gami? (2005-07-07 19:13:39 (木))

S2Daoを使用し、条件によってDBの接続先を変えることは出来るのでしょうか?

やりたい事

パラメータとしてdriverClassName、URL、user、passwordが
渡って来た場合は、この値を使ってDBに接続する。
パラメータで値が渡って来なかった場合は、
j2ee.diconの値でDBに接続する。

以上、宜しくお願いいたします。

  • これはできません。ちょっと違いますが、複数の DataSource を定義し、それぞれ用の S2DaoInterceptor を定義して使い分けることで、ある程度対応はできます。もちろんその場合は Dao (のコンポーネント) も複数になってしまいますけど。 -- suga 2005-07-15 08:53:53 (金)
  • 出来ないのですか、残念ですが諦めることにします。ありがとうございました。 -- gami? 2005-07-15 13:28:31 (金)

S2DAOでPKの無いテーブルのSelect

gami? (2005-07-07 18:59:14 (木))

S2DAOでselect文を自動生成させ、
プライマリーキーの無いテーブルで実行したところ
PrimaryKeyNotFoundRuntimeExceptionが発生してしまいます。

これは仕様なのでしょうか?
select文なのでプライマリーキーは関係ないような気もするのですが・・・

回避方法等があれば教えてください。
宜しくお願いします。


org.seasar.dao.PrimaryKeyNotFoundRuntimeException: [EDAO0009]pe.bean.entity.SxScanDataにプライマリーキーが見つかりません

	at org.seasar.dao.impl.AbstractAutoStaticCommand.checkPrimaryKey(AbstractAutoStaticCommand.java:137)
	at org.seasar.dao.impl.AbstractAutoStaticCommand.setupUpdateSql(AbstractAutoStaticCommand.java:110)
	at org.seasar.dao.impl.UpdateAutoStaticCommand.setupSql(UpdateAutoStaticCommand.java:28)
	at org.seasar.dao.impl.AbstractAutoStaticCommand.<init>(AbstractAutoStaticCommand.java:28)
	at org.seasar.dao.impl.UpdateAutoStaticCommand.<init>(UpdateAutoStaticCommand.java:18)
	at org.seasar.dao.impl.DaoMetaDataImpl.setupUpdateMethodByAuto(DaoMetaDataImpl.java:242)
	at org.seasar.dao.impl.DaoMetaDataImpl.setupMethodByAuto(DaoMetaDataImpl.java:134)
	at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:118)
	at org.seasar.dao.impl.DaoMetaDataImpl.setupSqlCommand(DaoMetaDataImpl.java:101)
	at org.seasar.dao.impl.DaoMetaDataImpl.<init>(DaoMetaDataImpl.java:93)
	at org.seasar.dao.impl.DaoMetaDataFactoryImpl.getDaoMetaData(DaoMetaDataFactoryImpl.java:42)
	at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:36)
  • 検索ではプライマリキーを見ないように1.0.14でなっているはずです。トレースを見るとUPDATE文を生成されているように見えるのですが、メソッド名等はどうなっていますか? -- suga 2005-07-15 09:42:21 (金)
  • S2Daoのバージョンは1.0.26を使用しています。メソッド名はselectです。 -- gami? 2005-07-15 10:55:06 (金)
  • ソースはS2DaoMakerをつかって自動生成させているのですが、PKのあるテーブルの場合は正常にselect文が発行されました。DBはMS SQL Server 2000を使用しています。 -- gami? 2005-07-15 11:11:00 (金)
  • S2Daoのサンプル (HSQLDB) でも発生することを確認しました。デグレードでしょうか。MLに投げてみます。 -- suga 2005-07-17 01:21:04 (日)
  • MLに投げました。大変申し訳ありませんが、以後はML(またはそのアーカイブ)をご覧ください。もしMLに未登録でしたら、参加して頂けると有り難いです。 -- suga 2005-07-17 02:07:54 (日)
  • 再現したというのは勘違いでした。Dao の interface に insert/update/delete 系のメソッドがあれば上記例外が発生します。SELECT 限定なのであれば、insert/update/delete 系のメソッドを削除してください。 -- suga 2005-07-20 05:31:34 (日)

S2Daoでテーブルの切替

rerun? (2005-07-05 19:52:11 (火))

S2Daoで条件によってTBLを切替える事は可能でしょうか。

やりたい事を簡単に説明しますと、

  • レイアウトは全く同じで、日付レンジのみ異なるテーブルが3つある。
  • パフォーマンス上の理由でテーブルは当月データ、前月データ、前々月データに分けられている。
  • 画面から条件指定で対象月を選択して、これらのテーブルから検索させたい。

    上記のような事を実現させたい場合、Bean、Daoインタフェース、SQLファイルをそれぞれ3つずつ作成するしかないのでしょうか。項目が同一なのでせめてBeanだけでも共用したいのですが何かスマートな方法はありますでしょうか。
  • できることはできます。スマートかどうかはさておき (^^;
    SELECT * FROM
    /*IF deptno <= 10*/DEPT/*END*/
    /*IF 10 < deptno && deptno <= 20*/DEP2/*END*/
    WHERE deptno = /*deptno*/
    深く検証までしていませんけど、1.0.23で動作は確認しました。 -- suga 2005-07-06 09:18:19 (水)
  • あ、このままだと2WaySQLになっていませんので、素のSQL文としては実行できません。 -- suga 2005-07-06 09:21:48 (水)

S2JSFで同一画面遷移時の初期化禁止

rmiya? (2005-07-03 02:04:34 (日))

S2JSF 1.0.3でgoogleのような検索画面(同一画面に検索結果を表示)を作成しています。

検索画面にページの初期処理(検索結果を格納している
DTOをクリアしている)を追加した状態で
検索処理を実行すると、
検索処理→初期処理の順番で処理が実行され、
検索結果がクリアされてしまいます。

同一画面に遷移時に、初期処理を実行しない方法はありませんか?

  • 初期処理が必要かどうかの判定を入れてください。検索条件と検索結果は別のDTOにしてクリアを分ける。あるいは、同じDTOでもクリアする部分を分ければ対応できると思います。 -- ひが 2005-07-03 18:35:46 (日)
  • 初期処理が必要かどうかの判定を入れることにしました。ありがとうございました。 -- rmiya? 2005-07-03 23:32:46 (日)

SingletonS2ContainerFactoryのinit

nemo? (2005-06-23 17:50:57 (木))

WebアプリケーションでS2コンテナを取得するためにSingletonS2ContainerFactoryを使っています。
S2コンテナを取得する際にinitメソッドの呼びだしが行われているのではないかと思うのですが、
取得後にinitメソッドを呼び出す記述の必要はありますか?

  • S2ContainerServletを使っている場合、S2ContainerServletの初期化処理でinitが呼ばれますので、必要ありません。もし使っていない場合はinitが一度必要ですが、S2ContainerServletの利用をお薦めします。 -- suga 2005-06-25 10:19:26 (土)

PukiWikiの対策を行ってください

( ´∀`)つ? (2005-06-01 21:49:07 (水))

余裕があればマイナーアップデートも。
http://pukiwiki.org/index.php?PukiWiki%2FErrata
PukiWiki1.4.5_1

  • ありがとうございます。実は「ここでは脅威にはならない」と判断して放置していたのですが (^^; アップロードを管理者のみにしておきました。 -- suga 2005-06-01 22:30:44 (水)

S2Daoで1テーブル対Nエンティティ

SAL? (2005-05-31 17:30:52 (火))

S2Daoで1つのテーブルを複数のBean(エンティティ)に対応付けたいのですが、実現方法が分かりません。

例えば

Personクラス{

String code;
String name;
Order order;

}

Orderクラス{
 String orderno;

 String item;

}

ORDERテーブル(
 CODE

 NAME
 ORDERNO
 ITEM

)

以上のような構成のとき、PersonDaoでgetAllPersons()をすると、Personクラスだけでなく、関連先のOrderクラスにもorderno,itemをセットしてほしいと思っているのですが実現方法が分かりません。

実現可能かも含め、ご指導下さい。

  • 可能といえば可能です.
    1:1 関連にある Person と Order が「たまたま」同じテーブルにマッピングされると考えてればよいかと.
public class Person {
  public static final String TABLE = "ORDER";

  String code;
  String name;
  Order order;
  ・・・
}
public class Order {
  String code;
  String item;
}
public interface PersonDao {
  public static final Class BEAN = Person;

  Person getPerson(String code);
}
  • このようなマッピングをしたくなるということは,適切に正規化されていないということなので,可能ならテーブル設計を見直した方がいいように思います.
    それができないからこのような質問になるのでしょうけど.(^^; -- koichik 2005-05-31 20:49:09 (火)
  • ありがとうございます。上記の方法ではこちらのしたい事(一度に2つのBeanに結果セット)はできなかったのですが、N:1マッピングを使用して実現することができました(同じテーブルだけどJOINする)。今回、既存のRDBとのマッピングなので、他にもいろいろなパターンが出てきそうです。 -- SAL? 2005-06-02 14:24:52 (木)
  • できませんでした? と思ってよく見たら,Person に public static final int order_RELNO = 0; が漏れてましたね... コピペの際のミスです.ごめんなさい. -- koichik 2005-06-02 16:31:25 (木)

S2DaoでのSQLヒント文

tetsu? (2005-05-24 15:50:05 (火))

S2DaoでSQLチューニングとしてヒント文(/*+ ヒント [ヒント] */)を利用しようとしています。

SQL自動生成では対応できないと思いますが、SQLを外部から指定した場合でも無理なのでしょうか。AbstractDaoの実装を行えばいけそうな感触ではありませんが未だ未検証です。

AbstractDaoの実装は工数がかかりますので、外部SQLを利用する場合の逃げ道がありましたらご教示願えないでしょうか。

  • Oracle なら「/*+ ヒント[ヒント] */」ではなく「--+ ヒント [ヒント]」を指定すればよかったはずです (他の RDB はよく知りません,ごめんなさい).-- は Java の // と同様,行末までがコメントと見なされます.これは SQL ファイルだけでなく,QUERY アノテーションに書いても大丈夫ではないかと思います (私は試してませんが).その際はアノテーション文字列中に改行文字を入れなくてはならないので見にくくなっちゃいそうですが. -- koichik 2005-05-24 21:25:14 (火)
  • すいません。まず誤りがありました。(誤)AbstractDao?の実装を行えばいけそうな感触ではありませんが(正)AbstractDao?の実装を行えばいけそうな感触ではありますが -- tetsu? 2005-05-25 10:37:53 (水)
  • ご指摘どおり「--+ ヒント [ヒント]」を利用して、外部SQLで流れることを確認いたしました。ありがとう御座いました。ちなみに「/*+ ヒント[ヒント] */」で行った場合はバインドとみなされ、SQLから削除される模様です。QUERYアノテーションに関しては現在、単純なWhere句程度にしか利用していないため、今回は利用しませんがおっしゃるとおり改行コードを記述すればいけそうですね。 -- tetsu? 2005-05-25 10:40:53 (水)

s2strutsでファイルアップロード

(2005-05-08 02:28:41 (日))

s2strutsでPOJOなFormBeanを使用してFormFileを扱うにはどうしたらよいのでしょうか?

  • Strutsを使うのと同じようにしてください。フォームクラスのプロパティーにFormFile。JSPへenctypeの指定を忘れないで下さい。(例:<html:form action="/upload" enctype="multipart/form-data">) -- きむきむ 2005-05-10 02:25:01 (火)

ステートフルを無効にしたい

Flash? (2005-04-29 00:16:56 (金))

S2OpenAMFなのですが、
実験のため、StateFull と StateLessの違いを示したいのです。
pojoでjava.io.Serializableを実装したときだけ、StateFullになり、
それ以外はStateLessになるようにするには、どのようにすればよいでしょうか?

デフォルトでは、すべてStateFullになってしまうようなのです。
ご存知の方、教えていただければ幸いです、。

  • S2でコンポーネントを管理した場合は、componentタグのinstance属性に従います。S2に管理させない場合は、上記のように状態を管理できるはずです。S2を使わないので、あまりS2OpenAMFのメリットはありませんが。 -- ひが 2005-05-01 19:46:49 (日)
  • ありがとうございました。しかしinstance属性をprototypeに変更してみたのですが、ステートフルのままです。<-S2のメリットは、すべてステートフルである、ということなので、これは当然ですね(そうでないとDIなどが実現できなくなるのですよね?)。OpenAMFそのものを入手し、使おうと思います。 -- Flash? 2005-05-05 21:21:34 (木)

S2Daoで全件削除

(2005-04-18 18:09:53 (月))

Daoインターフェイスに全件削除メソッドを定義しようと思い以下のように記述しましたが、SQL文がSELECT文と解釈されexecuteQuery()が呼び出されるため上手くいきません。

 static String doDeleteAll_QUERY = "delete from EMPLOYEE";
 void doDeleteAll();


解決策をお教えいただけないでしょうか。

  • メソッドの接頭辞を"delete"にし、アノテーションでなくSQLファイルを用意することで解決しました。初歩的な質問で申し訳ありませんでした。 -- 2005-04-18 18:38:22 (月)
  • 全件削除なら TRUNCATE もあります。一般的にこちらのほうが速いです。 -- hmaekawa? 2005-04-20 10:58:25 (水)

Action内の独自クラスにAOP可能?

(2005-04-11 19:26:06 (月))

S2の導入を考えているのですが、S2Struts を使用し、Action内の任意のクラスのメソッドにAOPにてインジェクション可能でしょうか(メソッド実行前・後のログ取得可能でしょうか)。サンプルからActionのexecuteには可能なのはわかったのですが、そのexecute内で呼んでいるクラスに可能かどうか教えていただけますか。(Springでは断念)

  • 対象のクラスがdiconファイルに記述されていて、ContainerからActionにインジェクションされていれば、可能です。(自分でコンテナから取得しても可) -- きむきむ 2005-04-12 10:30:45 (火)
  • おー!さっそく試してみます。 -- 2005-04-12 18:06:24 (火)

s2struts *.do→*.doの遷移

(2005-04-08 09:03:27 (金))

環境:
・Windows 2000 sp4
・j2se 1.4.2
・Tomcat 4.1.30
・Struts 1.2.4
・Seasar 2.2.6
・S2Struts 1.1.5
で開発しているのですが、ActionをPOJOにして、forward先を別のPOJO Actionにすると、getterによるrequestへの自動バインディングが出来ない模様です。
struts-config.xmlのvalidate属性をtrueにして、input属性がPOJO Actionだった場合も同様です。
とりあえずその部分だけ、StrutsのActionを継承させれば回避できます。
他の環境では試してないのですが、不具合でしょうか?

  • 実際に動作させてみますので、回答まで少しお待ちください。 -- きむきむ 2005-04-12 10:31:52 (火)
  • 実際に動作させましたが、自動バインディングはされました。Action,dicon,struts-configの記述内容を教えてください。 -- きむきむ 2005-04-12 12:55:54 (火)

S2DAO1.0.24埋め込み変数コメント

(2005-04-01 20:29:06 (金))

SQLファイルで文字列カラムのWhere句を

wehre ename = /*$dto.ename*/

とした場合、以下のように変数が埋め込まれ

wehre ename = FORD

シングルコーテーションで文字列が囲まれていなく、エラーとなってしまいます。

回避方法を教えてください

  • シングルクォートで囲んでほしいなら$は要らないですよ。 -- 2005-04-02 11:13:06 (土)
  • 回答ありがとうございます。初歩的すぎる質問ですみませんでした。これからはきちんとドキュメントを読みます。 -- 2005-04-04 09:16:21 (月)

s2struts1.1.4でSwitchAction

(2005-03-29 17:36:54 (火))

s2struts1.1.4でSwitchActionをした後
遷移した先のモジュールのActionを実行すると
「処理のためのパスが含まれて居ません」
と出て全てのリクエストが通らなくなります。
なにか特別な設定が必要なのでしょうか?
#s2struts無しの場合正常に動いているアプリケーションです
#s2strutsの設定はドキュメントの通り設定していて、Switch以外は正常に動きます

  • s2struts.diconに記述しているRequestProcessorのinstance属性をprototypeにしてください。次のリリース時にs2struts.diconを修正します。(リクエスト毎にインスタンスを生成する訳ではなくモジュール単位に1回だけ生成するので、パフォーマンスへの影響もありません) -- きむきむ 2005-03-30 12:34:55 (水)
  • 上記設定でうまくいきました! ありがとうございます。  -- 2005-03-31 23:48:39 (木)

S2DaoでのSQLファイルのエンコーディング

HM? (2005-03-04 18:14:15 (金))

S2DaoにてUTF-8でSQLファイルを記述しようと思ったのですが、
エンコーディング指定方法がありません。
ソースからは

DaoMetaDataImpl#setUpMethod~
 TextUtil.readText
   InputStreamRaderUtil.create
   InputStreamRaderUtil.create
     new InputStramRead( InputStream, "JisAutoDetect")

で、JIS系列の場合は大抵大丈夫なのでしょうが、I18n
を思うとこの固定値は変更可能であった方が良いと思い
ます。

  • 考えてみます。 -- ひが 2005-03-06 15:13:12 (日)

64bit環境下での動作保障について

もっともっと? (2005-03-03 16:07:04 (木))

ハードウェアはSolaris SPARC OS(64bit)で、APサーバにOracle10gで
開発予定です。
上記環境下でS2は動作するのでしょうか?

  • LinuxのOracle10gでは動いているので、たぶん大丈夫でしょう。 -- ひが 2005-03-04 12:37:58 (金)

daoについて

9? (2005-02-16 11:20:09 (水))

mysqlをwindowsにインストールして
実行して動いていたdaoが
Linuxにインストールした際には動かず
下記のようにテーブルが見つからないというエラーが返却されました。

ESSR0071]SQLで例外が発生しました。理由はjava.sql.SQLException: General error,
message from server: "Table 'SN13.tbhz021' doesn't exist"~
       at org.seasar.framework.util.DatabaseMetaDataUtil.getPrimaryKeySet
              (DatabaseMetaDataUtil.java:42)
       at org.seasar.dao.impl.BeanMetaDataImpl.setupDatabaseMetaData
              (BeanMetaDataImpl.java:230)
       at org.seasar.dao.impl.BeanMetaDataImpl.<init>(BeanMetaDataImpl.java:51)
       at org.seasar.dao.impl.DaoMetaDataImpl.<init>(DaoMetaDataImpl.java:82)
       at org.seasar.dao.impl.DaoMetaDataFactoryImpl.getDaoMetaData
              (DaoMetaDataFactoryImpl.java:41)
       at org.seasar.dao.interceptors.S2DaoInterceptor.invoke
              (S2DaoInterceptor.java:35)
       at org.seasar.framework.aop.impl.MethodInvocationImpl.proceed
              (MethodInvocationImpl.java:60)
       at org.seasar.framework.aop.proxy.AopProxy.intercept(AopProxy.java:123)
       at model.dao.sdao.daohz021.Daohz021
              $$EnhancerByCGLIB$$ee4442c4.selectCountByCondition(<generated>)


大文字と小文字の区別によるエラーだと思いましたが
DBのテーブル名もDAOで記載してあるDB名どちらとも大文字で書いてあります。

小文字でsqlが発行されているのではないかと思ったのですが、
そのような仕様だったりするのでしょうか?
dbのインストールミスかもしれませんが上記についてご指導お願いします。

  • すみません、以下のことについて教えてください。
    • 「インストール」とは、MySQL のことでしょうか。アプリ (Dao) のことでしょうか。
      それとも両方でしょうか。
    • Seasar2, S2Dao のバージョンはそれぞれいくつでしょうか。
      環境の問題だと、回答が遅くなるかもしれません。 -- suga 2005-02-17 09:36:20 (木)
  • 大文字と小文字の区別だとすると、Bean の TABLE アノテーションの値が小文字になっていないか確認してみてください。 -- suga 2005-02-17 09:47:48 (木)
  • バージョンですがdaoはs2-dao-1.0.10.jarでsearsorは2.0.20です。LinuxにインストールしたのはMySQLだけです。アプリはWindow上のままです。 -- 9? 2005-02-18 13:13:19 (金)
  • TABLEアノテーションが小文字(先頭のみが大文字)だったので大文字にして再度テストをしてみましたが、同様の結果となりました。 -- 9? 2005-02-18 13:18:45 (金)
  • どうやらテーブルの作成方法によって SQL に影響するようです。直接 JDBC を使ってそのテーブルに検索をかけても同じことになると思います。JDBC ではなくとあるツールを使っても同じでした。最初からサンプルとして存在する test データベース table1 テーブルでは起きないと思います。申し訳ありませんが、私はこれ以上分かりません。どなたか MySQL に詳しい方……。 -- suga 2005-02-19 01:20:48 (土)
  • いろいろ、ご迷惑おかけしてすみません。自分で調べていきたいとおもいます。 -- 9? 2005-02-21 09:12:35 (月)

同じ現象です(S2DAOのID自動生成機能について)

いまだ? (2005-02-08 15:25:53 (火))

s2-dao-1.0.18を使用しています。
identityを使ったIDの自動生成で、自動生成された値がBeanにセットされません。

DBはHSQLDBです。

・テーブルクリエイト文は以下のとおりです。

create table HOGE (
  ID      INTEGER NOT NULL IDENTITY,
  NAME    varchar(10),
  PRIMARY KEY (ID)
);


・JavaBeansは以下のとおりです。
(検証の為に、idの初期値をわざと-1にしています。)

package examples.dao;

import java.io.Serializable;

public class Hoge implements Serializable {
    public static final String TABLE = "hoge";
    public static final String id_ID = "identity";

    private int id = -1;
    private String name;

    public Hoge() {
    }

    /**
     * @return id を戻します。
     */
    public int getId() {
        return id;
    }
    /**
     * @param id id を設定。
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return name を戻します。
     */
    public String getName() {
        return name;
    }
    /**
     * @param name name を設定。
     */
    public void setName(String name) {
        this.name = name;
    }
}


・daoは以下のとおりです。

package examples.dao;
public interface HogeDao {
    public Class BEAN = Hoge.class;
    public void insert(Hoge hoge);
}


・diconファイルは以下のとおりです。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components.dtd">
<components> 
   <include path="dao.dicon"/>
   <component class="examples.dao.HogeDao">
       <aspect>dao.interceptor</aspect>
   </component>
</components>

・テスト用クラスは以下のとおりです。

package examples.dao;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class HogeDaoClient {

    private static final String PATH = "examples/dao/HogeDao.dicon";

    public static void main(String[] args) {
        S2Container container = S2ContainerFactory.create(PATH);
        container.init();
        try {
            HogeDao dao = (HogeDao) container
                    .getComponent(HogeDao.class);
            Hoge hoge = new Hoge();
            hoge.setName("foo");
            
            System.out.println("before insert id:" + hoge.getId());
            dao.insert(hoge);
            System.out.println("after insert id:" + hoge.getId());
            
        } finally {
            container.destroy();
        }
   }
}



・実行結果は以下のようになります。

before insert id:-1
DEBUG 2005-02-08 15:13:08,405 [main] 物理的なコネクションを取得しました
DEBUG 2005-02-08 15:13:08,415 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-08 15:13:09,336 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-08 15:13:09,366 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-08 15:13:09,376 [main] INSERT INTO hoge (name) VALUES('foo')
DEBUG 2005-02-08 15:13:09,426 [main] CALL IDENTITY()
DEBUG 2005-02-08 15:13:09,436 [main] 物理的なコネクションを取得しました
DEBUG 2005-02-08 15:13:09,436 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-08 15:13:09,476 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-08 15:13:09,476 [main] 論理的なコネクションを閉じました
after insert id:0
DEBUG 2005-02-08 15:13:09,486 [main] 物理的なコネクションを閉じました
DEBUG 2005-02-08 15:13:09,486 [main] 物理的なコネクションを閉じました

テーブルのIDカラムには正しくセットされていますが、
何度実行しても、
after insert id:0
となってしまい、自動生成されたid番号が取得できません。

なお、
SEQUENCEを使ったID自動生成では、うまくidを取得できました。

-1から0に変わっているので、
何かしらセットされているのだと思いますが、うまくいかないようです。
  • トランザクションを使ってないせい(insertで割り当てられたidentityが次のSQL文で認識できないため)でしょう。S2DaoTestCaseを使ってtestメソッドの最後にTxをつけて試してください。 -- ひが 2005-02-08 16:07:36 (火)
  • トランザクションを使うようにしたらうまくいきました。ありがとうございました。 -- いまだ? 2005-02-09 13:47:11 (水)

S2DAOのID自動生成機能について

ko-chan? (2005-02-08 11:10:26 (火))

ドキュメンテーションの通りにやっているのですが、ID自動生成機能が使えません。
ドキュメンテーションの設定以外にも設定が必要なのでしょうか?

ドキュメントの設定→『public static final String id_ID = "identity";』

  • 上記の解答のとおり、トランザクションを使っているか確認してください。RDBMSが何なのかでも変わってきますが、HSQLDBを使っているなら、sequenceを使うようにしてください。単純なidentityだとHSQLDBを再起動するとID値が元に戻ってしまうためです。 -- ひが 2005-02-08 16:11:28 (火)

selectのDAOについて

9? (2005-01-21 (金) 09:28:41)

char項目をselectのDAOで取得する際、
実際にDBに入っているデータより多くスペース
がついています。(データが2バイト文字の場合)
4桁のcharの項目に1文字(2バイト文字)のデータが入っている場合,
取得されるデータは3つのスペースが付加されます。
2バイト文字がフル桁ではいっている場合もスペースが付加されます。
対応策はないのでしょうか?

  • char 型は固定長の文字列を保存するための型なので,データの長さが足りない場合は後ろにスペースが付加されます.可変長の文字列を保存したければ varchar 型 (Oracle では varchar2) を使いましょう.詳しくは RDB の解説書を見てください. -- koichik 2005-01-21 (金) 15:32:27
  • 4桁のchar項目に1バイト文字を1 -- 9? 2005-01-21 (金) 17:33:08
  • 説明不足だったかも知れませんが、4桁のchar項目に2バイト文字を1文字入れた場合、普通2つスペースが付加されると思いますが、daoを使用し、selectした場合スペースが3つ付加されて取得されるんですが・・・。バイト数でなく文字数によりスペースの数を決めてるような感じで取得されうんですよ。rtrimするしかないんですかね。DBの項目を簡単にはかえられないので・・・。 -- 9? 2005-01-21 (金) 17:40:05
  • 下と同じであれば、RDBMS は Oracle と考えてよろしいでしょうか。Oracle のバージョン、Oracle データベースの文字セットを教えてください。 -- suga 2005-01-21 (金) 18:25:57
  • そういえば Oracle の JDBC ドライバがへぼいために,char 型では余計なスペースが付加されていたはずです.おそらく S2Dao を使わなくても同じ結果になると思います.しょうがないのでこちらでは無条件に tirm() しています. -- koichik 2005-01-21 (金) 19:03:09
  • えと,trim() は Java の String#trim() です.試していませんが,SQL で RTIRM してもダメだと思います.select 'A' from dual で 'A ' が返ってきていた記憶があるので... -- koichik 2005-01-21 (金) 19:07:03
  • 軽く確認してみました.さすがに select 'a' from dual では問題ありませんでしたが,select 'あ' from dual の場合,9iR2 では 'あ ' になりました.(^^; ちなみに 10g では直ってます.JDBC ドライバを 10g に出来ればそれがいいと思いますが,無理なら 9 さんが書いたように rtrim つけると中では varchar2 になるみたいで大丈夫になりますね. -- koichik 2005-01-21 (金) 19:45:06
  • 色々調べていただいてすみません。Oracle9i Release 9.2.0.1.0です。JDBCドライバはojdbc14.jarです。Oracle データベースの文字セットていうのは良く分かりません。 -- 9? 2005-01-26 (水) 11:54:00
  • 文字セットを見るには、このSQLを実行してみてください。-- suga 2005-01-26 (水) 14:17:27
    SELECT VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET'
  • 文字セットはJA16SJISです。 -- 9? 2005-01-27 (木) 16:21:53
  • 一番手っ取り早い対策は、koichkさんが挙げられている、10gドライバにすることでしょうね。Oracleのサイトには以下のように書かれていますので、問題なく動作するでしょう。-- suga 2005-01-27 (水) 18:06:27

    http://www.oracle.co.jp/products/system/matrix_db.html
    JDBC R10.1.0はOracle8i R8.1.7.4以降に対応します

  • 最初は検証するつもりでおたずねしたのですが、ちょっと時間を取れそうにありません。すみません。 -- suga 2005-01-27 (木) 18:13:42

daoについて

9? (2005-01-20 (木) 17:14:45)

updateのDAOを作成したのですが、
実際に.sqlのファイルに書いてあるSQL文と
少し違うSQL文が発行されてしまいます。
また、.sqlを修正してもログに書かれるSQL文は変わらなくて
困っています。名前をあわせること以外に何か重要なことでも
有るのでしょうか?

  • これだけだと情報が少ないので,DAO のコードと .sql の内容,それにログに出力された内容を seasar-user メーリングリストに送ってください. -- koichik 2005-01-21 (金) 15:36:04
  • すみません。解決しました。oracleのDAOに接続するのにSQLファイルにつけるサフィックスがmySQLになっていたためSQLファイルのSQLを見ていなかったようです。でもどうして、SQLが発行されたのかがわからないんですが・・・。 -- 9? 2005-01-21 (金) 17:49:20
  • その状況でサフィックス無しの .sql ファイルが無い場合、S2Dao は SQL 文の自動生成を試みます。メソッド名などが分からないため断定はできませんが、おそらく自動生成された SQL 文だったのでしょう。マニュアルと照らし合わせてみてください。 -- suga 2005-01-21 (金) 18:23:48

デバッグ方法

うちま? (2004-11-25 (木) 20:34:47)

S2JSFやS2Strutsにおけるバインディングの間違い、S2全般でコンポーネント登録漏れ等 dicon が関係する問題が発生した場合はどの様にデバッグを行えば良いのでしょうか。

またkijimunaを利用するにしてもミスを発生させにくいdiconの書き方の骨のようなものがあれば教えて下さい。

  • 自己レスです。プロジェクトのプロパティに「Seasar2 プロジェクト」という設定項目があり、それにチェックマークを入れる事でkijimunaエディタの使い勝手が激変しました。特に<include>タグにおける補完が出来るようになりミスが低下しました。またProblems ViewのFilter設定で「Kijimunaマーカー」にチェックを入れる事で問題が指摘されるようになりました。ホームページ上の使い方を参照せず、プラグイン内のREADMEだけを読んでいたのがミスの多い原因でした。 -- うちま? 2004-11-26 (金) 12:57:23

ステートパターンの実装

essence (2004-11-25 (木) 13:42:07)

seasar環境でステートパターンを実装するときに、インターフェースと実装の対応が実行時に1対1だと状態によるインスタンスを区別することが難しいと思うんですが、この場合どうしたらいいでしょうか。

  • DIコンテナで管理するオブジェクトは基本的にStatelessなので、Stateパターンには向きませんが、コンテナからインスタンスを区別して取得するには、コンテナから直接名前で取得するか、元になるインターフェースをそれぞれ拡張して、その拡張したインターフェースで取得する方法が考えられます。 -- きむきむ 2004-11-29 (月) 13:03:00
  • S2 で管理するコンポーネントは Singleton で、内部状態を State で (委譲して) 管理するという形ではいかがでしょうか。State の interface を直接見る必要は無いと想定しています。意図されている内容と合っていますでしょうか。 -- suga 2004-11-29 (月) 21:29:27
  • 回答ありがとうございます。 -- essence 2004-12-06 (月) 16:51:42
  • なるほど。たしかに、インターフェースのサブタイプをつくればできますね。>きむきむさん  -- essence 2004-12-06 (月) 17:02:30
  • 全部のインスタンス生成をコンテナに任せる必要はないということですね。たしかにそうでした。すっかり全部やるんだと思い込んでました。>sugaさん -- essence 2004-12-06 (月) 17:04:17

無題

(2004-11-18 (木) 23:28:42)

diconが増えてきたのですが、1箇所にまとめたりする方法などあるのでしょうか?

  • diconファイルはクラスパス上であれば好きなところに置けます。ルートとなるdiconファイル(例えばapp.dicon)に、各includeツリーのトップのdiconのincludeを書く、とすることで、初期化部分ではapp.diconを意識するだけで済みます。ただ、テスト用diconファイルなどはテストクラスと同じ位置に置くのが良いと思います。 -- 2004-11-19 (金) 10:11:32

初めて使う人によく聞かれること

S2DAOでのrollbackについて

にと? (2005-03-15 11:23:05 (火))

DB更新処理で
1.トランザクション開始
2.テーブルA更新 →成功
3.テーブルB更新 →失敗
4.ロールバック →トランザクション開始まで戻る
のような処理を実現したいのですが、
サンプルソースや情報源教えて下さい。

  • トランザクションの自動管理機能の説明は S2 本体のドキュメントにあります。サンプルは「SeasarSampleProject」の初級上から三番目をご覧ください。1 のところに AOP で自動管理を追加することになります。失敗のときに例外を投げる形になりますので、RDBMS が認識できない業務的な「失敗」の場合には Dao を使うところでチェックして例外を投げる必要があります。 -- suga 2005-03-16 07:36:03 (水)
  • 丁寧な回答ありがとうございます。教えていただいたサンプルで確認することができました。もっとちゃんとドキュメント読むようにします。 -- にと? 2005-03-16 13:26:48 (水)

FAQ向けの質問案


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-09-07 (土) 13:00:52 (1532d)