いくつかの背景として、Web アプリケーションで JPA/Hibernaate/Spring を使用しています。エンティティを処理するために org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter と拡張永続コンテキストも使用しています。
問題:
ユーザーがエンティティの編集リンクをクリックする
エンティティはfindメソッドを使用してデータベースからロードされ、エンティティはセッションに保存されます
ユーザーがエンティティに変更を加えて保存する
ユーザーの変更は、セッション (コントローラー内) に格納されたエンティティに反映されます。
エンティティは、サービス クラスのメソッド (@Transactional でアノテーションが付けられている) に送信されます
エンティティ(または他のエンティティ)への変更はサービスクラスでは発生しません(他の非永続性関連のものを行います)
サービスメソッドが完了した後、変更はデータベースにフラッシュされません!!!?
注: サービス クラスはスプリング コンポーネントです。そのために作成されたスプリング プロキシをデバッグしました。@Transactional で注釈が付けられたサービス メソッドを呼び出すと、サービス メソッド呼び出しの前にスプリングが新しいトランザクションを作成し、トランザクションが正常にコミットされることもわかりました。私の理解では、エンティティへの変更はトランザクション境界で発生しませんでしたが、それでもデータベースにフラッシュする必要があります。変更がフラッシュされないのはなぜですか?!