[jpa:6] Re: Hibernate EntityManagerの使用感想

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 4月 18日 (水) 16:00:24 JST


小林 (koichik) です.

Date:    Wed, 18 Apr 2007 02:27:08 +0900
From:    Hidenoshin Yoshida <[E-MAIL ADDRESS DELETED]>
To:       [E-MAIL ADDRESS DELETED]
Subject: [jpa:4] Re: Hibernate EntityManagerの使用感想

> 仕事でHibernate EntityManagerを使っていますので、
> まずはそのお話をしてみようかなと思います。

ありがとうございます!!

> 最初に大きく悩んだのは、Hibernateの双方向1対1の挙動の問題でした。
> 小林さんが書かれたJava ExpertのJPA特集の中でも詳しく書かれてありましたが
> 単純に1対1の定義をしたらLAZYロードが無効になってしまい
> 一覧取得等で凄まじい量のQueryが発行されてしまってかなり困りました。

これはビックリしますよね.
当方では再帰的な関連のあるテーブルでこれに該当
してしまい,途方もない量の SQL が延々と
発行されるという状況になりました...

これは Hibernate の遅延ロードが

1.対 1 関連を「関連先」エンティティの
   Proxy として表す.
2.Proxy はインスタンス生成時に主キーが必要.

ということと,Hibernate 自身がイベントドリブンな
実装になっていることから来ているもので,抜本的な
対応は難しそうだなぁと感じています.

この辺りは「関連元」のクラスをエンハンスして,
関連にアクセスされた際にフェッチする TopLink の
実装の方が好ましいように思えますね.

> 例えば、Entityではない普通のBeanを戻り値として望む場合、JPQLなら
> SELECT new 句を使うと思いますが、これがSQLだと、戻り値がObject配列に
> なってしまいます。

JPA でも Native Query の結果を非エンティティに
マッピングする方法が決められていますが,かなり
面倒なのでなかなか使う気がしませんよね.
エンティティにマッピングするならそこまで面倒でも
ないのですが...
そもそもエンティティではない結果が欲しい場合にこそ
複雑な問い合わせが必要になって JPQL では無理な場合が
多いわけで,Native Query から非エンティティへの
マッピングが面倒なのは次期 JPA では改善して欲しい
ポイントの一つですね.

> 最後に、色々悩んだのが排他制御でした。

ここは悩みどころですね.

> 結局、Entityを一旦Sessionに保存し、mergeを使ってUPDATEする方法に
> 落ち着かせました。

一応,これが一番ベーシックなやり方ということに
なるのかもしれませんね.

自分は merge を使わず,主キーとバージョン番号指定で
SELECT し直す方が好きです.
その時に FOR UPDATE を付ける標準的な方法があると
いいのですが,今の JPA 仕様ではないですよね?
TopLink はヒントで指定できるらしいですが,これは
仕様として必須ではないかなぁ.

> この部分については、JPAでのベストな手段はどうなのか
> 未だによくわかっていません。ただ、個人的には
> ExtendedなEntityManagerはシステムの複雑性が増す気がするので
> あまり第一には考えたくないと思っています。

同意です.
ユーザ数が増えた場合のメモリの消費量も
気になりますし...

この点,SFSB + Extended Persistence Context を
活用してるらしい JBoss Seam を使ってる人がいれば
感想を聞いてみたいですね.


--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>



jpa メーリングリストの案内