2

JPA実装としてHibernateを使用しています。私のvaadinアプリケーションEntityManagerはリクエストスコープです(蓄積された変更の制御されていないコミットを避けるため)。デタッチされたエンティティをセッションに保存し、リクエストで必要になるたびに再アタッチします (リクエストごとに 1 回、 を使用して確認しますem.contains())。エンティティは別のエンティティを参照し、そのエンティティは別のエンティティを参照するため、最終的に、セッション スコープのエンティティをルートとする 3 レベルのカスケード ツリー グラフが作成されます。

これは、完全に新しいノード (合計で 5000 項目以上) を持つ大きな完全に新しいツリーができるまでは正常に機能します - Hibernate はマージ時に新しいノードをそれぞれ見つけよselectうとします (ログでその試みを確認できます - 存在しない ID による多くの s)。これはバグですか、それとも私が JPA を誤用しているだけですか?

アップデート

@Versionフィールドは使いません。

アップデート*

私のアプリでは、カスケード関係の構造に関係なく、すべてのエンティティ サブツリーを格納するために同じアプローチを使用しているため、さまざまなユース ケースを区別できないため、マージを使用しています。

4

1 に答える 1

2

新しい選択を避けるためではentityManager.persist()なく、完全に新しいツリーに使用する必要があると思います。新しいエンティティと永続化されたエンティティの両方に使用でき、休止状態は何をするか (SQL の挿入または更新) を決定する必要があり、そのためにそれらの選択が必要です。entityManager.merge()merge()

于 2013-11-13T11:59:36.807 に答える