4

私は現在、デスクトップアプリケーションでJPAを試していますが、GUI開発を容易にするためにBeansBindingを使用しています。これまでのところ、結果はかなり良好です。

サンプルアプリケーションとして、テーブルが1つしかない小さなDBがあります。エンティティPUを正常に作成しました。次に、JTableをメインのJFrameにドロップし、その列をJPAクエリにバインドしました。これは魅力のように機能します。したがって、エンティティに加えられた変更はテーブルに反映され、その逆も同様です。

次に、変更がDBに保持されるように、テーブルを編集可能にしたいと思いました。私が思いついた最も簡単な方法は、クエリを開始してすぐにコミットすることでした。したがって、どこかにJButtonがあると仮定して、次の手順を実行しますactionPerformed

private void saveClicked(java.awt.event.ActionEvent evt) {
    this.myEntityManager.getTransaction().begin();
    this.myEntityManager.getTransaction().commit();
}

これは完璧に機能しますが、私には奇妙に間違っているように見えます。私もこれをやろうとしましたwindowClosing。成功しました。

しかし、なぜこれが機能したのですか?つまり、トランザクションbeginと。の間にコードはありませんcommit。そしてもっと重要なことに、これを行っても大丈夫ですか?

4

1 に答える 1

2

このやや不安定な動作は、entitymanagerが明示的に通知されることなくコミットされていない変更を保持する場合に発生します。これは、アプリケーション管理のエンティティマネージャーが常に拡張されているためです。JPA仕様(セクション3.3)には次のように書かれています。

アプリケーション管理のエンティティマネージャの永続コンテキストの範囲が拡張されます。永続コンテキストのライフサイクルを管理するのはアプリケーションの責任です。

したがって、問題のBeanがすでに永続コンテキストにあり、transaction.commitを実行すると、明示的なentitymanager.persistがなくても、コミットされていない変更は永続化されます。トランザクションをコミットする前にentitymanager( entitymanager.clear )をクリアすることで、この動作を自分で確認できます。これにより、エンティティがtx-commitから削除され、トランザクションがデータベースに変更を加えないようになります。

于 2010-02-20T09:53:49.470 に答える