読者です 読者をやめる 読者になる 読者になる

S2Buri on PostgreSQL

 [ESSR0068]テーブル(BuriData)のカラム(pathID)が見つかりません

なんて怒られるんですがなぜ?
色々いじってるとたまにバリエーションで「BuriPathにdataIDがありません」みたいにでることもあったり。
なぜかたすきがけ。

j2ee.diconでderby系にしてるときは問題ないんですが、derbyがわからんもんで、慣れたPostgreSQLで使ってみたいんですが…。

SQLファイル

なんとなくわかりました。
BuriPathDaoの外部SQLファイルが、DBごとに個別に用意されてました。
で、それが

  • BuriPathDao_getBuriPathByDataID_derby.sql
  • BuriPathDao_getBuriPathByDataID_maxdb.sql

の2つしかないと。
PostgreSQL用のSQLファイルが定義されてないので、BuriPathテーブルにdataIDカラムがあることを前提としたSQLが自動生成されてしまうわけですね。
で、当然そんなカラムなんぞないと怒られる。

うーん。
S2Buri組み込みテーブル系はderbyにまかせて、自前でDaoをつくるデータ系だけPostgreSQLに外だしするのが期待されている構成なのかな?

暫定対処

とりあえず、src/org/seasar/buri/dao配下で、XXX_derby.sqlなファイルをコピーして、XXX.sqlとリネームします。
derby用のSQLは標準っぽいので、そのままPostgreSQLにも通りそうだと思いまして。

で、次にPostgreSQL用のスキーマですが、idをserialで作成するとデフォルトのsequenceの名前が、S2Buri(の中のDto)が期待しているsequenceの名前体系と異なるのでエラーになります。

SQLException: relation "buripathid"がありません。

みたいなかんじで。

なので、自分でsequenceを生成する必要があります。というわけで、スキーマは↓。

DROP TABLE BuriState;
DROP SEQUENCE BuriStatusID;
CREATE SEQUENCE BuriStatusID;
CREATE TABLE BuriState (
       stateID              INT4 NOT NULL DEFAULT nextval('BuriStatusID'),
       branchID             INTEGER ,
       pathID               INTEGER ,
       dataID               INTEGER ,
       userIDVal            VARCHAR(20),
       autoRunTime          TIMESTAMP,
       userIDNum            INTEGER,
       insertDate           TIMESTAMP NOT NULL,
       processDate          TIMESTAMP NOT NULL,
       abortDate            TIMESTAMP NOT NULL,
       versionNo            INTEGER NOT NULL,
       PRIMARY KEY (stateID)
);

DROP TABLE BuriBranch;
DROP SEQUENCE BuriBranchID;
CREATE SEQUENCE BuriBranchID;
CREATE TABLE BuriBranch (
       branchID             INT4 NOT NULL DEFAULT nextval('BuriBranchID'),
       parentBranchID       INTEGER ,
       pathID               INTEGER ,
       dataID               INTEGER ,
       processDate          TIMESTAMP,
       versionNo            INTEGER NOT NULL,
       PRIMARY KEY (branchID)
);

DROP TABLE BuriDataPathHistory;
DROP SEQUENCE BuriHistoryID;
CREATE SEQUENCE BuriHistoryID;
CREATE TABLE BuriDataPathHistory (
       historyID            INT4 NOT NULL DEFAULT nextval('BuriHistoryID'),
       pathID               INTEGER ,
       dataID               INTEGER ,
       userIDVal            VARCHAR(20),
       userIDNum            INTEGER,
       insertDate           TIMESTAMP NOT NULL,
       PRIMARY KEY (historyID)
);

DROP TABLE BuriData;
DROP SEQUENCE BuriDataID;
CREATE SEQUENCE BuriDataID;
CREATE TABLE BuriData (
       dataID               INT4 NOT NULL DEFAULT nextval('BuriDataID'),
       pkeyVal              VARCHAR(250),
       pkeyNum              INTEGER,
       dataType             VARCHAR(200) NOT NULL,
       PRIMARY KEY (dataID)
);

DROP TABLE BuriPath;
DROP SEQUENCE BuriPathID;
CREATE SEQUENCE BuriPathID;
CREATE TABLE BuriPath (
       pathID               INT4 NOT NULL DEFAULT nextval('BuriPathID'),
       pathName             VARCHAR(100) NOT NULL,
       realPathName         VARCHAR(100) NOT NULL,
       PRIMARY KEY (pathID)
);

-----------------------------------------

--DROP INDEX XIF1BuriBranch;
--DROP INDEX XIF2BuriBranch;
--DROP INDEX XIF3BuriBranch;
CREATE INDEX XIF1BuriBranch ON BuriBranch ( pathID );
CREATE INDEX XIF2BuriBranch ON BuriBranch ( parentBranchID );
CREATE INDEX XIF3BuriBranch ON BuriBranch ( dataID );

--DROP INDEX XIF1BuriState;
--DROP INDEX XIF2BuriState;
--DROP INDEX XIF3BuriState;
--DROP INDEX XIF4BuriState;
CREATE INDEX XIF1BuriState ON BuriState ( pathID );
CREATE INDEX XIF2BuriState ON BuriState ( dataID );
CREATE INDEX XIF3BuriState ON BuriState ( autoRunTime );
CREATE INDEX XIF4BuriState ON BuriState ( branchID );

--DROP INDEX XIF1BuriDataPathHi;
--DROP INDEX XIF2BuriDataPathHi;
CREATE INDEX XIF1BuriDataPathHi ON BuriDataPathHistory ( pathID );
CREATE INDEX XIF2BuriDataPathHi ON BuriDataPathHistory ( dataID );

--DROP INDEX XIE1BuriData;
--DROP INDEX XIE2BuriData;
CREATE INDEX XIE1BuriData ON BuriData ( pkeyVal, dataType );
CREATE INDEX XIE2BuriData ON BuriData ( pkeyNum, dataType );

とりあえずこれで第1関門は突破。

次は、

[EBRI0019]同名のActivityがあるのにユーザ情報が無いためDELF.Q&A管理でActivityが選択されませんでした

のエラーの謎を解く番です。

先は長い…orz

複数ロールに注意

上記のEBRl0019は、ロールを複数指定していたために発生していたようです。

複数のロールが含まれるワークフローでは、ParticipantProviderが必須だということのようですね。

ちょっと試すぐらいのフローで、いきなり調子に乗ってロールレーンを複数つくってしまったのが仇となったわけでした。

次のエラーは、

org.seasar.buri.exception.BuriOGNLRuntimeException: [EBRI0002]OGNL値取得エラー

です。

明日考えるとして、もう寝よう。おやすみなさい。