初心者向けORM注意点

@btnrouge のORMに関する注意事項をまとめさせて頂きました。
0
Kenji HASUNUMA "btnrouge" @btnrouge

Hibernateをデータベース接続とログテーブルへの書き込みのみに使い、他のデータベース処理をJDBCコネクションを横取りしてやっているコードも見た。ちなみに、Hibernate 4.0ではJDBCコネクションを横取りするメソッド自体が削除される予定らしい。

2011-09-08 15:58:08
Kenji HASUNUMA "btnrouge" @btnrouge

ORMが使っているJDBCコネクションを横取りすると、マッパー側のエンティティやキャッシュとデータベースの同期がとれなくなる可能性があるのでとても危険。僕はORMにはあまり詳しくないけど、それでも一目見てやばいと思うレベルの危険度。

2011-09-08 16:00:29
Kenji HASUNUMA "btnrouge" @btnrouge

ORM(JPA含む)を使いこなせいのなら、ORMは使ってはいけないと思う。間違ってもORMを部分的に使って、コネクションを横取りしてJDBCでデータベースをいじるなんてことはやってはいけない。

2011-09-08 16:02:46
Kenji HASUNUMA "btnrouge" @btnrouge

たぶん、ORMを適当に使っている人たちは、エンティティを更新したと同時にDBに反映される、とか、DBのレコードを更新したと同時にエンティティ側に反映される、とでも思っているんじゃないかな、という気がしてならないです。

2011-09-08 16:05:59
Kenji HASUNUMA "btnrouge" @btnrouge

例えばJPAの場合、エンティティとテーブルの同期をいつやるかは原則JPA側が握っています。アプリ側でエンティティを更新しても、すぐにテーブルに反映されることはありません(経験上)。JDBCと同じ感覚で行くと、いつまでたってもテーブルに反映されないと感じるくらいです。

2011-09-08 16:13:29
Kenji HASUNUMA "btnrouge" @btnrouge

JPAでエンティティへの更新をすぐにテーブルに反映させたいのなら、2次キャッシュを無効化した上で、persistやmergeなどとセットでflushを実行します。それでもJDBCより若干遅れますが、限りなく即時反映に近くなります。

2011-09-08 16:17:26
Kenji HASUNUMA "btnrouge" @btnrouge

個人的な見解ですが、ORMの効果は「インピーダンス・ミスマッチの解消」ではなく、「無駄なデータベース・アクセスをなくすことによるパフォーマンスの向上」だと思っています。エンティティは最終的にテーブルと同期してさえいればよいので、途中のいらない更新はDBに送らなくていいのです。

2011-09-08 16:23:48
Kenji HASUNUMA "btnrouge" @btnrouge

本日のORM/JPA関係の一連のツイートは以上。自身の経験から、最低限この程度のことは押さえておかないと、いざJPAを使ったときに死にます、確実に。

2011-09-08 16:26:59