- PR -

[Hibernate] 何故かPropertyAccessException

1
投稿者投稿内容
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2007-01-31 12:55
お世話になっております。

Hibernateを使用しているのですが、非常に不可解な現象に遭遇して困っております。

[環境]
Java:5.0
Hibernate:3.2.1

[現象]
コード:
session.createCriteria(Hoge.class).list();


の場合は正常に動作するのだが
コード:
int count = (Integer) criteria

.setProjection(Projections.rowCount())
.uniqueResult();

として結果件数を取得した後、
コード:
criteria.setProjection(null);

List list = criteria
.setFirstResult(pageIndex * pageSize)
.setMaxResults(pageSize);

とするとPropertyAccessExceptionが送出される場合がある。

[考察]
上記現象が発生するクラスと発生しないクラスがあるので差異を比較した所、発生するクラスにはmany-to-oneのマッピングが存在する。
デバッグした所、リフレクションによってプロパティを取得しようとしている箇所
(BasicPropertyAccessor$BasicGetter.get(145行目))で、メソッドオブジェクトは
正しいのだが、ターゲットオブジェクトに、エンティティの配列が渡されてしまっている。
setProjection(null)を行ったCriteriaで発生する模様。

[所感]
なんかHibernateのバグっぽいとも思うのですが、私の使用方法が間違っているのでしょうか。
どなたか指摘事項及び回避策をご存知の方がいらっしゃいましたらご教授願いたく、宜しくお願い致します。

以上

#ミスタイプ修正

[ メッセージ編集済み 編集者: SUK2 編集日時 2007-01-31 14:06 ]
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2007-01-31 14:08
criteria.setCacheable(true)としていた部分をコメントアウトした所正常に動作しました。
出来ればキャッシュ機能を使用したいので、なぜキャッシュすると動作しないのか
ソースを追ってみたいと思います。
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2007-01-31 18:34
自己解決しましたので、一応ご報告させて頂きます。

デバッグモードでソースを追っていった結果、やはりCriteria.setCacheableと
Criteria.setProjectionが原因でした。

以下、私もソースを全て読んだ訳では無いので、誤りがあるかもしれませんが
私の解釈と対応策を記載します。

現象を整理しますと、

Criteria.setCacheable(true)かつ、Criteria.setProjection(Projections.rowCount())と
した後でCriteria.setProjection(null)とした場合にPropertyAccessExceptionが送出
されておりました。

ソースを見た限り、キャッシュを有効にした場合と無効にした場合で、使用される
クラス及びメソッドがかなり異なりました。キャッシュ有効の場合は、途中にキャッシュ
からgetしたりputする処理が挟まれるだけかと思っていたのですが違う様です。

上記の差異だけでは通常通り動作するのですが、setProjection(null)とした場合に
さらに異なる動作をします。

setProjectionにnull以外を渡した場合、Criteria内部に通常のCriteriaでは無い事を
示すオブジェクトがセットされる様で、setProjectionにnullを渡しても
このオブジェクトはリセットされていない様でした。
その為、エンティティが渡されるべきメソッドにエンティティの配列が渡されてしまって
いるのだと解釈しました。

私の対策としましては、このメソッドを修正し、setProjectionにnullが渡された時に
上記オブジェクトをリセットするようにした所、所望の動作をする様になりました
(この動作が仕様的に正しいのかは何とも言えませんが)。

なぜキャッシュの使用・不使用で動作が変わるのかは探求しませんでしたが、恐らく
Projectionか否かの判定ロジックが違うのでは無いかと思われます。

#結局、自己満足の日記の様になってしまいました・・・
#失礼しました。
1

スキルアップ/キャリアアップ(JOB@IT)