はじめまして。
5月にNCDCに入社した北村(@chipstar_light)といいます。
今回は、6/14に「うらがみがJavaまわりのORMを知りたい会」という勉強会に参加してきたので、その内容と感想について書きたいと思います。
弊社のEnterprise BaaS製品であるAppPotもサーバーサイドはJavaで構築されており、管理ツールのデータアクセスにはJPA(Hibernate)を利用していますので、参考にさせて頂きます。
うらがみがJavaまわりのORMを知りたい会
- http://connpass.com/event/3583/
- 関西を代表するJavaエンジニアであるうらがみさん(@backpaper0)とJavaまわりのORMを勉強しようというもの
- 関西のJava界隈のエンジニアが20名程集まっていました。
- 結構ギークな面々。名古屋からも強力な方が一名。
「JavaのORM、Domaの話+α」:@backpaper0さん
やはりDomaについての話が印象的でした。
DomaはS2Daoの進化系。
SQLファイルとDAO、クエリ実行結果とEntityをシンプルにマッピングする技術というイメージ。
@backpaper0さんの言葉を借りるとObject ResultSet Mapper。
- Pluggable Annotation Processing API(JSR269)をうまく利用している
Pluggable Annotation Processing APIはコンパイル(javac)時にアノテーションを使った機能拡張が実装でき、Domaではコンパイル時のコード生成や規約チェック、SQLファイルの構文チェックを行っているようです。
SQLファイルの構文チェックはとてもありがたいですね。 - Java8にも積極的に対応
Date and Time API、Optional、Stream/Collectorに対応しているようです。
Seasarプロジェクトは全体的には少し落ち着いているイメージでしたが、Domaは期待大です。
「F 社乙女チームの ORM (黒) 歴史」:@daiksyさん
自分の発表資料を作成していてあまり聞けてていませんでした…。
@daiksyさん、すいませんm(_ _)m
資料が公開されたら勉強します!
「jOOQの紹介」:@chipstar_light
飛び入りで私も個人的に発表をさせてもらいました。
会場に着いてから話を受けて、@daiksyさんの発表中に資料を作ったので、時間が全然なくて資料の体裁はひどい…
ですが、皆さん広い心で聞いてくれました。感謝。
資料は以下です。
「ORM 初心者が使おうとした」:@kyon_mmさん
jOOQ、iciql、Slick(Scala)を紹介された後、実装が(try-catchで)煩わしくなりがちなエラー処理周りがこれらのフレームワークでどう対応されているかの話でした。
- 楽観ロック
.NETのEntityFrameworkやjOOQ、JPAは提供しているが、iciqlは提供しておらず、Slickも提供してないに近い見たいですね。
この辺は当たり前に提供されるのかと思ってましたが、そうでもない製品もあるんですね。 - 悲観ロック
jOOQはSQLを構文レベルでサポートしているので、forUpdateを呼び出せば良い。
でも他の製品はSQLを記述する事になりそう。
業務系では結構重宝するのでサポートしておきたいですが、RDBに依存しすぎる部分があって難しいかのな。 - リトライ
これ、サポートしている製品見た事無いですね。
でも、結構な割合で必要となって作り込む事が多い。
面白かったのは、Azureはネットワークが遅いのでタイムアウトが多く、DBアクセスの場合はデフォルトでリトライロジックを書かないと使い物にならないよという話。知らなかった。 - コネクションプール
JDBCレベルで持っていてほしいですよね。
BoneCPがとても早いらしい。
一説では、DBCPと比較して50倍くらい早いなんと言っている人もいるらしいです。
試す価値ありますね。
Domaもそれに近いですが、jOOQやiciqlのように、コマンドラインでマッピングコードを生成するのは最近ではトレンドなんですかね。
「MyBatisを使用した大規模開発の事例紹介 〜成功談や失敗談など〜」:@s_kozakeさん
MyBatisを使っていかにして楽ができるかに挑戦されたお話。
特に面白かったのはMyBatisが持つコード生成機能を拡張する仕組みを利用して、大規模案件らしい拡張をされていた事。
テーブルのメタデータだけでなく、SQLからコードを生成するという発想が面白かったです。
定義したSQLから、Mapper.xmlとMapperクラス、モデルが生成されます。
ビューを作るまでもないレベルだけど、固定の条件を必ずつけるクエリでデータアクセスしたい場合に便利。
このアイデアは便利だと思いました。
「GORM めっさゆるい」:@kazuhito_mさん
GORMはGrailsのORM。
最近、Grailsから独立して、単体で利用できるようになったらしいです。
クエリの定義の仕方が面白いです。動的言語の良さを生かしてますね。
- Rails由来のダイナミックファインダー
- findByに続けて1つ以上のプロパティ名を組み合わせたメソッド名の形式で呼び出す事により、特定のプロパティに対して検索をかけることができます。
def model = モデル.findByTitle("The Stand")
モデル.findBy([Property][Comparator][Boolean Operator])?[Property][Comparator]
- Whereクエリー
- クロージャで条件を定義
- 条件の書き方も直感的で、Javaじゃできない。
-
1234def query = Person.where {firstName == "Bart"}Person bart = query.find()
以上が発表内容と感想でした。
この勉強会で頂いた情報を、AppPotの開発やコンサルティングに生かしていきたいと思います。