0

データベースでデータを永続化するために jpa を使用する Java SE プロジェクトに取り組んでいます。

現在、データベース操作ごとに新しいエンティティマネージャーを取得し、関数呼び出しが終了したら閉じます。お気に入り

public void save(T entity){
  em = getNewEntity();
  em.persisty(entity);
  em.close;
}

しかし、多対多の関係を管理するのは非常に困難です。たとえば
、エンティティ B と多対多の関係を持つエンティティ A があります。CascadeType.MERGE があります。

A を作成したら、 B を作成し、複数のスレッドを実行して A と B の両方の情報を生成します。ただし、B が古い A を保持する場合があります。B をマージすると、A のデータは消去されます。

例えば ​​。A は music 、B は music album であるため、1 つの B には A リストがあります。別のスレッドが音楽メタデータを読み取り、音楽タグ情報を取得して A を更新し、新しい A が FS で見つかったときに B が更新されます。
エンティティ マネージャが閉鎖されたため、B の A リスト内のエンティティは古くなっています。つまり、A が自分自身を更新したときに、B は A が更新されたことを知りません。B をマージすると、jpa は B の A リスト内のエンティティを使用して A をマージするのに役立ちます。

この問題を解決するために、1 つのエンティティ マネージャーを使用し、すべてのデータベース操作を 1 つのスレッドに入れることにしました。すると新たな問題が出てきます。

トランザクションがアクティブであり、エンティティに対してトランザクションが開始されることになっている場合

transaction.begin();
....
transaction.end();

ただし、多くのスレッドが実行されており、それらのスレッドもエンティティを変更する可能性があります。

私の質問は: Java SE 開発で jpa を使用する方法?. ありがとう

4

1 に答える 1

0

関係が同期しなくなった場合、JPA を責めることはできません。正常な関係を維持するのは、アプリケーションの責任です。

JPA では、一般に Java と同様に、関係を維持するのはアプリケーションまたはオブジェクト モデルの責任です。

ソース

@home が言ったように、適切に同期する必要があります。

そうは言っても、EntityManager はスレッドセーフではないため、何らかの方法でこれを解決する必要があります。アプリケーションを同期し、スレッドごとに 1 つの EntityManager を使用し、@PersistenceContext を使用するなど。

編集:これは、 EntityManagerへのアクセスの同期についての質問です。私はそれがあなたに役立つかもしれないと思います。

于 2012-06-10T17:22:44.130 に答える