0

だから、私はここでアイデアを求めてストローを本当に握っています。(注:これは断続的な問題です)

「子」オブジェクトのコレクションを持つ「親」オブジェクトがあります。

<親のもの>
...
<set name = "children" reverse = "true" order-by = "child_id">
<cacheusage = "read-write" />
<key column = "parent_id" />
<one- to-many class = "ChildClass" />
</ set>
...
</ parent>

<child stuff>
...
<many-to-one name = "parent"
column = "parent_id"
insert = "true"
update = "true"
not-null = "true"
class = "ParentClass"
index = "idx_child_parent" /> ...
</ child>

次のようなクエリを実行した場合:"ChildClassの子から子を選択"+ "where child.parent =:parent"; それはすべての子供を見つけます。完全。

ただし、親オブジェクトを検索(および検索)すると、休止状態が実行されてParentClassが作成されますが、子の1つ(最初の)の子のみが設定されます。私は実際に休止状態のコードにデバッグし、ParentClassでのsetChildren()の呼び出しは、最初のクエリからさらに多くのものがあることがわかっているときに、1つの要素コレクションのみが送信されていることを発見しました。

したがって、私はEHCacheを使用していますが、それをクリアしても効果はありません。CacheManager.getInstance()。clearAll();を呼び出します。

アプリケーションを再起動しても機能します。一見ランダムに見える親のインスタンスで、その後すぐに中断するだけです。

これを直接引き起こすために起こっていること(私が知っていること)は何もありません。これを引き起こす休止状態のバグ、またはEHCacheのバグを知っている人はいますか。キャッシュでclearを正しく呼び出していますか?

どんなポインタでもいいでしょう。

私はhibernate3.2.6を使用していますが、同じ問題がmysqlとpostgresで発生しています。

編集:要素が1つしかないこのコレクションは、「存在しない」状態にあることも追加する必要があります。すなわち。子要素が1つだけになるトランザクションはありませんでした

4

2 に答える 2

2

あなたの Child クラスは hashcode() と equals() を正しく実装していますか? Hibernate が、同じ親にアタッチされている複数の子クラスを同等のものとして認識し、そのうちの 1 つだけを永続化する可能性はありますか?

于 2009-11-23T05:35:56.330 に答える
1

ある時点で、レビューを取得するときに「結合フェッチ」を行っていることがわかりました。結合フェッチとは、子のコレクションについて、where 句に一致する子のみが返されることを意味します。したがって、10 を超える 3 人の子供と 10 未満の子供が 1 人いるとします。where 句で子が 10 未満である場合、親オブジェクトが返され、その 1 人の子供のみを含む子供のセットが返されます。それは問題ありません。それが「結合フェッチ」の目的です。

問題は、Ehcache がこの親オブジェクトが「不完全」であることを認識していないため、この不完全な値をキャッシュに保存することです。次回「完全な」親オブジェクトが必要な場合、取得できず、不完全なものが取得され、Hibernate はそれ以外のことを教えてくれません (知りません)。

編集:注意してください、それが起こるたびにそれがたった1つの子要素だったのは偶然でした. もっとある可能性があります。

于 2010-02-10T04:58:37.277 に答える