DBFlute-1.2.4 Released

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にとって幸せを感じられるもの!

って深く実感しました笑

今年は、もうちょい色々とやっていきたいです。

f:id:jflute:20200610110311j:plain