1

現在、Java-EE6(GlassFish 3.1.2、MySQL Server 5.1、およびNetbeans 7.1.1)を使用した3層アプリケーションに取り組んでいます。

プロジェクトは現在、3つのプロジェクトで構成されています。

  • エンタープライズアプリケーション/EJB:データベース上のエンティティを制御するためのファサード
  • Java Class-Library:データベースモデルを表す@Entity注釈付きクラス(このプロジェクトは、階層間でエンティティインスタンスを交換するために、EEアプリとファットクライアントによって共有されます)
  • J2SEファットクライアント:サーバーリソースのJNDIルックアップ(EJBへのリモートアクセス)

エンティティの作成/変更/削除時にクライアントのGUIを更新するために、各クライアントが起動時にサブスクライブし、EJBコンテナ上のメッセージ駆動型Beanがパブリッシャーとして機能するトピックを実装することにより、JMSを利用することにしました。

今、私は次の大きな問題に直面しています。

  • ライフサイクルリスナー(@PostUpdateなど)をエンティティオブジェクトにアタッチしました。エンティティオブジェクトは、サブスクライブされたクライアントに更新メッセージを公開する必要があります。エンティティクラスはclass-libプロジェクトに存在しますが、パブリッシャーはEEアプリに存在します。問題は、EEアプリがclass-libプロジェクトを参照するが、その逆はできないことです(循環プロジェクト参照は許可されていないため)。したがって、エンティティクラスのライフサイクルコールバックメソッドには、EEアプリのメッセージ駆動型パブリッシャーBeanへの参照がありません。

これはより設計に関連する質問であり、Java-EE6を使用して3層アプリケーションを設計するための基本的に正しいアプローチであるかどうかを尋ねます。

複雑さをできるだけ低く抑え、アプリケーションが大量のネットワークトラフィックを生成しないようにするために、可能であればDTO/DAOを避けたいと思います。

事前にアドバイスありがとうございます!

4

1 に答える 1

0

@Entityオブジェクトをすべてのレイヤー間で直接渡すことで、問題を解決しました。静的ウィービングをアクティブ化することで(jpaプロバイダーとしてeclipse-linkを使用)、重い関係に遅延フェッチを使用することができました。クライアント側から特定の重要な関係のみをフェッチするために、ロードグループを使用して、エンティティをエンティティマネージャーから切り離すネットワーク経由でシリアル化する前にプリフェッチする必要がある遅延関係を定義します。逆に、エンティティをサーバーに再度送信するには、サーバー側のファサードでEntityManager.merge(T)を使用して、エンティティを管理対象状態に戻します。この設計は、非常に複雑なデータ階層でも問題なく機能します。

于 2012-10-24T08:14:35.067 に答える