2

このように設計された所有者 (カテゴリ) と顧客 (フォーラム) エンティティがあります。

カテゴリー

...

@OneToMany( fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "category" )
@OrderBy( "position" )
private List<Forum> forums;

...

フォーラム

...

@ManyToOne
@JoinColumn( name = "category" )
private Category category;

private Integer        position;

...

Web アプリケーションのどこかにフォーラム リストを表示し、そのうちの 1 つでビジネス アクションを実行します。たとえば、位置を変更します。

私の問題は、変更がデータベースに適切に保持されているが、 OneToMany マップされたコレクションに反映されていないことです。したがって、リストを表示するページを更新すると、新しい位置ではなく前の位置が表示されます。

要素の位置を更新するために使用するコードは、単純なem.merge( forum ). 双方向の関係を「手動で管理」する必要があるという多くのトピックを読みました。そうしないと、この種の問題に直面することになります。ここに私の2つの質問があります:

  • EclipseLink と Hibernate の両方で試してみましたが、Hibernate ではうまく動作しますが (リストは更新されています)、EclipseLink では動作しません。キャッシングモードの違いに関連していますか?
  • リストの要素のプロパティの 1 つが変更されたこと (たとえば、フォーラム リスト内のフォーラムの位置プロパティ) を手動で通知するにはどうすればよいですか?

[編集]このトピックを読みましたが、私の問題は、リストの取得に使用されているセッションとは別のセッションによってフォーラムが更新されていることに関連していると感じています。私はそれを正しく理解していますか?はいの場合、そのケースを正しく管理する方法は?

4

1 に答える 1

1

オブジェクトの両側を設定すると仮定して (設定する必要があります!)、eclipselink キャッシュを無効にしてみてください。 <property name="eclipselink.cache.shared.default" value="false"/>

@source http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

于 2013-11-07T08:58:13.617 に答える