0

次の質問はNetbeans7.2に関するものですが、7.1、7.0、6.8、および6.9にも当てはまると思います。

2つの異なるデータベースDB1とDB2からエンティティクラスをマップしようとしています。どちらにも同じ名前のテーブルTBが含まれています。DB1.TBとDB2.TBのフィールドは完全に異なります。

2つのデータベースのエンティティを生成し、クラスを別々のパッケージにドロップしています(DB1の場合は「entities.db1」、DB2の場合は「entities.db2」としましょう)。

問題は、2番目のデータベースのエンティティを生成するときに、TBテーブルがすでに存在しているため、UPDATEまたはRECREATEのいずれかしか許可されていないことです。再作成すると他のTBエンティティが削除され、更新するとホットな混乱が発生します。

個別の永続性ユニットを作成しようとしましたが、違いは見られませんでした(そして、データベースウィザードからエンティティクラスでPUを選択する方法はありません)。

選択の余地がないように見えますが、Db1TbとDb2Tbという名前のクラスは必要ありません。私の質問は、私は何か間違ったことをしているのですか?2つのテーブルが同じ名前のNetbeansを使用してエンティティクラスを作成する別の方法はありますか?

4

1 に答える 1

0

分離が鍵であることがわかりました...私は3つのプロジェクトを作成しました:

  • myEntities:データベースからのエンティティクラス(永続ユニットの作成を無効にします)
  • myEJBs:エンティティクラスとローカルインターフェイスのセッションBean(PUはここにあります)
  • myEJBRemotes:リモートインターフェイス(Session Beansウィザードによって作成されます)

単一のWebアプリケーションのみがこれらのBeanを参照している場合、それらをすべてパッケージ化して一緒にデプロイすることができます。ただし、独立してデプロイされるWebアプリケーションをいくつか作成するつもりなので、EJBを依存関係として各モジュールに追加すると、問題が発生します。デプロイ時に、Glassfishはその名前のEJBがすでにデプロイされていると文句を言います。

繰り返しになりますが、分離が解決策でした...私の最初のアイデアは、EJBモジュールをデプロイしてから、エンティティモジュールとリモートモジュールを依存関係としてWebアプリケーションに追加することでした。これは完全には機能しませんでした。EJBモジュールにはエンティティクラスへの参照がありませんでした(EJBをデプロイする場合、その依存関係はアプリケーションサーバーに送信されるパッケージに含まれていません)。

別のプロジェクトを作成しました。今回は、ejbモジュールと関連するjar(エンティティとリモート)を一緒にEARとしてパッケージ化したプロジェクトで、ようやくうまくいきました。このEARはGlassfishにスタンドアロンでデプロイでき、Webアプリケーションはエンティティとリモートのjarに依存関係を追加するだけで済みます...

チップ:

  1. maven-ear-pluginについて:<defaultLibBundleDir>lib</defaultLibBundleDir>構成に追加します。そうしないと、ライブラリが耳のルートに配置され、glassfishがNoClassDef例外をスローし始めます。

  2. Webアプリケーションについて:Webアプリを別々のEARにデプロイしていて、たとえば、いくつかのカスタムクエリを使用しようとしている場合、すべてがバンドルされている場合のように、EJBからEntityManagerを「借用」することはできません。少なくとも、私が知る限りではありません)。persistence.xml1つのファイルで複数のユニットを共有できますが、新しい永続ユニットを作成する必要があります。もちろん、EJB用に作成したエンティティを再利用することもできます。

  3. 永続性ユニットについて:永続性ユニットはエンティティと同じプロジェクトにないため<exclude-unlisted-classes>true</exclude-unlisted-classes>、PUが表すすべてのエンティティクラスを設定して含めるようにしてください。これは、EJBモジュールとWebアプリケーションの両方のPUに当てはまります。

これを行う方法はこれだけではないと確信しています。おそらく(おそらく)最善の方法でもありません。より良い方法を提供している人の話を喜んで聞きたいです...

于 2013-01-03T16:20:55.237 に答える