問題:S2jdbc-gen-buildタスクを実行したところテーブルが見つからない
sqlstate:42p01が発生していた。
ログ抜粋
/s2jdbc-gen-build.xml:40: Exception in thread "main" org.seasar.extension.jdbc.gen.exception.CommandFailedRuntimeException: [ES2JDBCGen0005]コマンド(org.seasar.extension.jdbc.gen.internal.command.GenerateEntityCommand)の実行に失敗しました。バージョンは S2JDBC-Gen 2.4.46 です。理由はorg.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[], Message=[ERROR: relation "public.mstuser" does not exist
[gen-entity] DEBUG 2015-07-12 11:22:30,396 [main] select user_id from public.mstUser where 1 = 0
原因
オペミス。pgAdmin3でテーブル作成する際の名称が不適切だった。
具体的にはpgAdmin3でテーブル名:mstUserを作成していた。
(本来:mst_userとすべき)
pgAdmin3でGUI上で大文字・小文字を混在したテーブルを指示すると、プログラマが指示通りにオブジェクト名は大文字・小文字が混在したものが作成される。(これは自動生成されるDDLがクウォートを付与するためと考えられる)
・エラー
select user_id from public.mstUser where 1 = 0
・正常
select user_id from public."mstUser" where 1 = 0
postgreSQLの仕様
オブジェクト名について
大文字・小文字は区別する
SQL発行時のダブルクウォート有無について
ダブルクウォート:なし
大文字は自動的に小文字に内部的に変換して処理される。
public.mstUser → public.mstuser
※オブジェクトは大文字・小文字を区別するのでnot existエラーが発生する。
ダブルクウォート:あり
大文字を自動的に小文字に変換せず処理される。
"public.mstUser" → public.mstUser
従って、テーブルが見つかる。
対策
テーブル名は小文字で統一し、アンダースコアで区切る
(本来:mst_userとすべき)
##参考サイト
https://www.softel.co.jp/blogs/tech/archives/1847
http://faq.smileserver.ne.jp/faq/1060/app/servlet/qadoc?fromid=001&qid=000822
http://takuya-1st.hatenablog.jp/entry/20110907/1315373488