9

大変な状況です。

  1. 休止状態の特別な機能を使用するため、休止状態を終了できない大規模なプロジェクトがあります。
  2. 組み込みモードでプロジェクトにActivitiプロセスエンジンを追加し、JPA拡張機能(EntityManagerでのみ機能)を利用します。
  3. 一部のエンティティはJPA永続ユニットに存在しないようにする必要があります。これは、アクティビティのドキュメントに、すべてのエンティティに@Idが必要であり、@ IdClass / @ EmbeddedIdを使用できないため、そのようなエンティティを永続ユニットから除外する必要があるためです。
  4. EntityManagerとSessionに1つの共有トランザクションマネージャーを使用したいと思います。また、dataSourcesは同一です(または共有されています)
  5. すべてが春です!

このすべての取り組みは、ActivitiがそのJPA拡張にEntityManagerを使用できるようにすると同時に、既存の休止状態の依存コードが機能し続けるようにすることです。

4

1 に答える 1

5

まず、上記の3番目のポイントは、永続性ユニットを1つ必要とし、Hibernateエンティティで実際に@ IdClass / @ EmbeddedIdを使用している場合、対応するのが難しい場合があります。考えられる解決策は次の2つです。

  1. JPAをプロジェクトにプルし、既存のHibernateエンティティの永続性ユニットを構成しますが、セッションに直接アクセスして、既存の呼び出しをHibernateに委任し続けます。この場合、構成はJPAに移行されますが、コードは移行されません。このアプローチは、プラグイン可能な方法でSessionオブジェクトをディスペンスする合理的な抽象化があることも前提としています。ソリューションの要点については、この質問を参照してください。上記のポイント3で柔軟性がゼロの場合、このアプローチは選択肢にならない可能性があります。

  2. セッションファクトリと永続性ユニットの両方を作成し、2つのXAデータソースでJTAを使用してトランザクションを調整します。データが同じデータベースに存在する場合でも、このアプローチを採用する場合は、構成に個別のデータソースを作成する必要があります。これにより、分散トランザクションに参加するときにSpringのトランザクションプロキシが混乱するのを防ぐことができます。これはおそらく最もクリーンなアプローチですが、XAトランザクションの汚名を背負っています。これは、コンテナによっては、技術的な問題というよりも、最近の政治的な問題になっています。

于 2012-12-21T16:54:59.140 に答える