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値取得エラー
です。
明日考えるとして、もう寝よう。おやすみなさい。