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

Hidenoshin Yoshida [E-MAIL ADDRESS DELETED]
2007年 4月 19日 (木) 07:29:02 JST


吉田(da-yoshi)です。

> これは Hibernate の遅延ロードが
> 
> 1.対 1 関連を「関連先」エンティティの
>    Proxy として表す.
> 2.Proxy はインスタンス生成時に主キーが必要.
> 
> ということと,Hibernate 自身がイベントドリブンな
> 実装になっていることから来ているもので,抜本的な
> 対応は難しそうだなぁと感じています.

Hibernateの関連定義全体に関わってる部分なので、
Hibernateを使う限りこの問題は残ってしまう気がしますね。
HibernateがProxyで関連先を表すことによって
LAZYロードとEAGERロードでロードされるクラスが異なる
場合が出てくるのですが、この動きも、
仕組みを知っていないとハマってしまう一因かなと思います。


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

Hibernate以外のJPA実装は、だいたい関連元の方のEntityを
エンハンスする方法をとってるみたいですね。
JavaSE環境だとjavaagent等の仕掛けが必要になってくる
のが欠点ですが、EJB3環境では特に問題なく使えるのが
利点かなと感じてます。
Hibernateはその代わり、JavaSE環境でもEJB3環境でも
殆ど挙動が変わらないので、より汎用的に利用できる
のが個人的には気に入ってます。

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

JDBC使う場合でもResultSetからキャスト無しで結果の
カラムを受け取れるので、それよりも使い勝手が悪いのは
流石にどうかなと感じてしまいました。
JPQLで殆どのSQL処理を代行できるのならいいのですが
現実にはまだJPQLは機能が足りなすぎるので
このSQLサポートの貧弱さは、現バージョンのJPAの
最大の弱点ではないかと感じてます。
逆にSQLの利用部分だけ、JPA以外の何らかの方法
(JPA実装nativeなAPIを使う・Kuina-Dao等のJPA機能強化
ライブラリを使う等)を使うやり方を確立させれば
今のJPAバージョンでも十分業務に対応出来るとも
実感しています。

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

バージョンを保持しなければいけないのと、
更新時にバージョンが違っていた場合、
独自にOptimisticLockExceptionを投げなければいけないのを考えて
自分はmergeを選択してしまったのですが
HttpSession等にEntityを保持する手法は
あまり安易に選択してしまうと、大量同時アクセス時に問題が
ありそうな気がしますね。
また、Sessionに入れていたEntityがSerializeされるときの
こととか、クライアントがブラウザではなかったりした場合
どちらにしてもEntityから別のデータに変換する必要が出てくるので
Entityをそのまま保存しておく手法は万能ではないと感じてます。
ここら辺も、Entityをアクティヴにし続けるExtendedな戦略と
ずれてしまうので、どちらの方法がいいのかは、
もっと調べる必要がありそうです。

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

自分も、機会があればSeam系のExtendedな戦略を推進
してるフレームワークについてもっと知りたいですね。
TransactionScopeとExtendedでは、Entityに対する
考え方が大きく異なると感じているので
どちらを選ぶにせよ、両方の利点・欠点を知るのが
大事なのかなと思っています。

-- 
吉田秀之進
[E-MAIL ADDRESS DELETED]


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