0

いくつかの背景として、Web アプリケーションで JPA/Hibernaate/Spring を使用しています。エンティティを処理するために org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter と拡張永続コンテキストも使用しています。

問題:

  1. ユーザーがエンティティの編集リンクをクリックする

  2. エンティティはfindメソッドを使用してデータベースからロードされ、エンティティはセッションに保存されます

  3. ユーザーがエンティティに変更を加えて保存する

  4. ユーザーの変更は、セッション (コントローラー内) に格納されたエンティティに反映されます。

  5. エンティティは、サービス クラスのメソッド (@Transactional でアノテーションが付けられている) に送信されます

  6. エンティティ(または他のエンティティ)への変更はサービスクラスでは発生しません(他の非永続性関連のものを行います)

  7. サービスメソッドが完了した後、変更はデータベースにフラッシュされません!!!?

注: サービス クラスはスプリング コンポーネントです。そのために作成されたスプリング プロキシをデバッグしました。@Transactional で注釈が付けられたサービス メソッドを呼び出すと、サービス メソッド呼び出しの前にスプリングが新しいトランザクションを作成し、トランザクションが正常にコミットされることもわかりました。私の理解では、エンティティへの変更はトランザクション境界で発生しませんでしたが、それでもデータベースにフラッシュする必要があります。変更がフラッシュされないのはなぜですか?!

4

2 に答える 2

1

エンティティをフラッシュするには、エンティティを管理する必要があります。エンティティはおそらく切り離されています。

この場合、分離される理由として 2 つの可能性が考えられます。

  1. 拡張永続コンテキストの場合でも、エンティティ マネージャーが作成されて閉じられます。おそらく、サーバーへの呼び出しごとに開いたり閉じたりしますか? 次に、そのエンティティが作成されたサーバーへの別の呼び出しでエンティティを保存しようとするため、エンティティ マネージャーは新しいものになり、エンティティは管理されません。

  2. エンティティは、サーバーへのこれらの呼び出しの間でシリアル化されます。エンティティがシリアル化されると、切り離されます。これは、サーバーが呼び出しの間にセッション データをディスクに書き込むことが多いため、簡単に発生する可能性があります。

于 2013-01-16T12:28:17.663 に答える
-1

ユーザーの変更がサービスレイヤーの外部で行われた場合、サービスレイヤーの内部でpersistを呼び出さない限り、変更は自動的に永続化されません。

entityManager.persist()

ここで、persistovermergeを使用する理由を確認できます。

お役に立てば幸いです。

于 2013-01-16T11:48:04.100 に答える