DBFlute Runtime/Engineのリリース
あけましておめでとうございます。
DBFlute-1.2.4 をリリースしました。
Change Log | DBFlute
(移行の注意点は特になし)
十三年連続、十三回目の元旦リリースです!
今回、重要な修正が入っています!!!
代表的なものをここで紹介します。
大量関連テーブルでのSpecifyColumnのバグ
現場からのフィードバックで発見できました。
発生のメカニズム
まず前提して以下の状況:
o 11個以上の(相手がoneになる)関連テーブル を持っている
o ネストの関連テーブルをsetupSelect(with) している
o SpecifyColumnをしてるテーブルとしてないテーブルが混在
そして、発生する現象としては...
とあるテーブルのSpecifyColumnを指定すると、とある別の全カラム列挙対象のテーブルのカラムがselect句に列挙されなくなる。
というものです。
"とある" というのが非常にレアな状況ではあります。
例えば、MAIHAMAテーブルのConditionBeanにて...
cb.setupSelect_Sea().withHarbor(); cb.specify().specifySea().specifyHarbor().column... cb.setupSelect_Land(); // こっちはSpecifyColumnしてない
としていて、もしSQL上のテーブルのエリアス名が、たまたま以下のように、アンダースコアだけの違いになった場合...
HARBOR: dfrel_1_0
LAND: dfrel_10
この場合、LANDのカラムがselect句に列挙されなくなってしまいます。
この番号は、メタデータの中の関連テーブルを識別する番号になっています。
SEA: 1 (MAIHAMAから見て)
LAND: 10 (MAIHAMAから見て)
HARBOR: 0 (SEAから見て)
なので、関連テーブルが多いテーブルの場合、10以上の番号が発生して、ネストしたテーブルのsetupSelect(with)により、"1_0" という "10" に近い表現になってしまい、内部的に判定が誤ったものになってしまいました。
ということで、1.2.4 では、この問題は解決しました。
(解決の実装自体は簡単でした。アンダースコア識別の有無を間違っていました)
明らかにそのテーブルのデータが取れないので、開発中にすぐ気付くものではありますが、いざ現象が発生すると驚かれると思います。
取り急ぎの回避策
急バージョンでの回避策としては、LAND も SpecifyColumn すれば、カラムはselect句に列挙されます。
Java6版でも発生するので回避を
これは Java6版でも発生します。
Java6版は環境的にリリースが難しいので、発生した場合はSpecifyColumnの回避策をお願いします。
もしくは、ちょっとした拡張による対応もできますので、未然に防ぎたい場合は、jfluteに質問してください。
拡張の仕方をご案内します。(少々ややこしく個別でフォローした方が良いので、ここでは書きません)
FreeGenのJSONパースでGsonやsaiを
あまり利用者は少ないかもですが、FreeGenでJSONを扱うことができます。
そのパーサーとして、JDK同梱のNashornを使っていましたが、JDK15より削除されてしまったようです。
よって、JDK15だと、それら機能が使えなくなってしまうので、代替パーサーとして、Gsonやsaiを使えるようにしました。
DBFluteクライアントのextlibディレクトリに、Gsonもしくはsaiのjarファイルを置けば、そちらが利用されるようになります。
(saiは、依存ライブラリであるasmのjarも一緒に配置が必要です)
LastaFluteと組み合わせてDBFluteを使われている方は、大いに関係あるので、いずれ現場のJavaのバージョンが上がったときに、ちょっとだけ意識することになると思います。
まとめ
大変な時代になってしまいましたが、それでも現場からこのようにフィードバックを頂けるというのは感謝感謝です。
SpecifyColumnの件は、自力では全く気付かなかったでしょう。
(本当にありがとうございます)
バタバタとしながらも、なんとか元旦リリースできました。
やっぱり...
DBFluteの実装するってのが、jfluteにとって幸せを感じられるもの!
って深く実感しました笑
今年は、もうちょい色々とやっていきたいです。