2

遅延読み込みを使用する PrimeFaces (3.2) データテーブルに問題があります。データは Hibernate (3.6) を使用して MySQL データベースから読み込まれます。

問題は、データテーブル内で結果が重複していることです。私はこれについて多くの調査を行いましたが、ほとんどの問題は、OneToMany/ManyToOne/... 関係の「EAGER」ロードを使用していることです。私のエンティティには、5 つの ManyToOne リレーションと 1 つの OneToOne リレーションがあります。

結果は DAO を使用して読み込まれ、2 行が返されます。データテーブルには、次の順序で 4 つの行が表示されます。

  1. 結果1
  2. 結果2
  3. 結果1
  4. 結果2

count(*) クエリは、正しい行数 (2) を返します。

hibernate の「show_sql」スイッチが true に設定されているときにログに記録される SQL クエリを直接使用すると、2 行が正しく返されました。

最初は、これらのリレーションの一部は熱心に読み込まれていましたが、すべてを遅延読み込みに変更しましたが、成功しませんでした。2 行を正しく返す DAO メソッドをデバッグしました。次に、データはprimefacesデータテーブルにロードされ、どこかに複製されます。

次に、別のユーザー アカウントを使用して同じことを試みたところ、重複する行がないことがわかりました。

次に、関連するエンティティのすべてのレコードをデータベースから削除しましたが、成功しませんでした。

ここで何が問題なのか本当にわかりません。ManyToOne/... 関係をすべて排除し、外部キーを整数値として直接マップして、結合を回避し、何も変更しませんでした。

コードのどの部分が役立つかわかりませんが、必要な場合は共有できます。

助けてくれてありがとう!

[編集] 結果トランスフォーマーを使用し、リストの代わりにエンティティをセットにマッピングしても役に立ちませんでした。データベース、したがって休止状態は常に正しい行数を返しますが、DAO とデータ表。

[編集 2] さらに調査した結果、これはページネーションの pageSize が 15 に設定されている場合にのみ発生することがわかりました (5、10、15 の 3 つの値から選択できます)。

10 に設定すると、すべてが期待どおりに機能します。別のエンティティを持つ同じコードが別のページで機能するため、これの何が問題なのか本当にわかりません。

4

1 に答える 1

0

私の場合、リストされているクラスのマップされたフィールドをEAGERからLAZYに変更すると機能します。pageSize を変更しても違いはありません (*編集 2)。さらに、web.xmlに追加する必要がありました

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

このエラー org.hibernate.LazyInitializationException...no session または session was closed を回避するために

于 2016-04-17T15:45:16.590 に答える