DBFluteのMS-Access自動生成

DBFlute 0.8.2(?)からMS-Access用の自動生成ができるようになってます。build-project.propertiesのtorque.databaseには「msaccess」を指定します。JDBCの設定(databaseInfoMap.dfprop)はこんな感じで。

map:{
    ; driver    = sun.jdbc.odbc.JdbcOdbcDriver
    ; url       = jdbc:odbc:exampledb
    ; schema    =
    ; user      =
    ; password  =
}

url中のexampledbはODBCデータソースの名前を指定します。
id:jfluteさんもおっしゃってるように、PKとFKのメタデータが取得できないので、自分でadditionalPrimaryKey.dfpropとadditionalForeignKey.dfpropをゴリゴリ書くことが必要になります。ただしForeignKeyを記述しても、DBFluteのBehaviorでは1つしか結合できない*1ので、メリットはBsEntityに結合したテーブルのプロパティが付くことくらいです。複数のテーブルを結合する必要がある場合は外だしを使うのがよさげです。2Way-SQLにも対応していて*2、outside-sql-testしてsql2entityもできるので、検索系は普通のデータベースと同じ感じで使えます。

更新系も結構普通に行うことはできます。が、Accessでいうオートナンバーを使うにはちょっと作業が必要です。
まず、オートナンバーに関してはメタデータが取れてないのかDBFluteが対応してないからなのか、BsEntityにIDアノテーションがつきません。ExEntityに自前でIDアノテーションをつける必要があります。
また、Accessではオートナンバーで振られたIDを取得するのに

SELECT @@IDENTITY

と実行するのですが、これをJDBCから実行するときStatememtのFetchSizeを設定すると例外になる、というわけわからん動作をします。S2DaoのIdentityIdentifierGeneratorはデフォルトでFetchSizeに100をセットしていて、しかもその辺外から変更できなさげ*3だったので、自前で実装する必要があります。この辺実装して、DBFlutebasic-exampleをAccessで実行したら70%くらいは動くようになりました。

DBFluteへの感謝の気持ちも込めて、この辺をdbflute-msaccess-exampleとして作成中です。できたら送りつけますのでよろしくです>id:jfluteさん

*1:AccessのJoin構文が変だから

*2:AccessSQL中のコメントをコメントとして解釈できないので、DBFluteが実行時にコメントを削除してくれる

*3:BasicSelectHandlerを中でnewして使っていたので割り込む場所がなかった