現在、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を避けたいと思います。
事前にアドバイスありがとうございます!