S2Daoメタデータの取得処理解析2

去年の続き。どうすればaddColumnsメソッドの呼び出しがを1度だけで済ませられるかについてメモ。

addColumns(dbMetaData, convertIdentifier(dbMetaData, schema), convertedTableName,map);
addColumns(dbMetaData, schema, tableName, map);
addColumns(dbMetaData, null, convertedTableName, map);
addColumns(dbMetaData, null, tableName, map);

この4回呼び出しているaddColumnsメソッドの違いは、引数である「スキーマ名」「テーブル名」が異なる。各呼び出しでの値はこのとおり。

No スキーマ テーブル名
1 定義されている値を変換した値*1 定義されている値を変換した値
2 定義されている値 定義されている値
3 null 定義されている値を変換した値
4 null 定義されている値

値そのものは変わらないので、値が誤っていたら列情報絶対見つけれないのでEND。即ち1回目の呼び出しで済ませるには、正確なテーブル名・スキーマ名を定義しておく必要がある。
これらの値の定義場所は

となる。
以上。

  • まとめるとエンティティのTABLEアノテーションの定義ですべてが決まる。
    • DBMSが小文字・大文字区別するなら定義する場合も区別して定義する。
    • 定義したテーブルのスキーマが、接続ユーザと異なるなら「スキーマ名.テーブル名」の形で定義する。

今までSQL自動生成おこなわない場合は、わざわざTABLEアノテーション定義していなかったけど、定義したほうがいいみたい。というか、SQL自動生成使わないならメタデータ取得する必要ないので、取得しないような設定ができていいかも。あとDatabaseMetaData#getColumns使わず、ダミーSQLを使ったメタデータ取得方法の方が高速かも。これは後で調査。

*1:DBMSの種類によって大文字・小文字に変換されるかが異なる。変換しない場合もある。Oracleなら大文字